engine: client: add function for parsing common protocol messages, which structure is enforced by server DLL compatibility
This commit is contained in:
parent
67c898f9ad
commit
5ceab059dc
4 changed files with 61 additions and 85 deletions
|
@ -2388,6 +2388,54 @@ ACTION MESSAGES
|
||||||
|
|
||||||
=====================================================================
|
=====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
============
|
||||||
|
CL_ParseCommonDLLMessage
|
||||||
|
|
||||||
|
parse a message which structure is enforced by DLL compatibility
|
||||||
|
it should always be the same regardless of protocol used
|
||||||
|
============
|
||||||
|
*/
|
||||||
|
qboolean CL_ParseCommonDLLMessage( sizebuf_t *msg, connprotocol_t proto, int svc_num, int startoffset )
|
||||||
|
{
|
||||||
|
int param1, param2;
|
||||||
|
|
||||||
|
switch( svc_num )
|
||||||
|
{
|
||||||
|
case svc_temp_entity:
|
||||||
|
CL_ParseTempEntity( msg, proto ); // need protocol because message header differs
|
||||||
|
cl.frames[cl.parsecountmod].graphdata.tentities += MSG_GetNumBytesRead( msg ) - startoffset;
|
||||||
|
break;
|
||||||
|
case svc_intermission:
|
||||||
|
cl.intermission = 1;
|
||||||
|
break;
|
||||||
|
case svc_cdtrack:
|
||||||
|
param1 = MSG_ReadByte( msg );
|
||||||
|
param1 = bound( 1, param1, MAX_CDTRACKS ); // tracknum
|
||||||
|
param2 = MSG_ReadByte( msg );
|
||||||
|
param2 = bound( 1, param2, MAX_CDTRACKS ); // loopnum
|
||||||
|
S_StartBackgroundTrack( clgame.cdtracks[param1-1], clgame.cdtracks[param2-1], 0, false );
|
||||||
|
break;
|
||||||
|
case svc_weaponanim:
|
||||||
|
param1 = MSG_ReadByte( msg ); // iAnim
|
||||||
|
param2 = MSG_ReadByte( msg ); // body
|
||||||
|
CL_WeaponAnim( param1, param2 );
|
||||||
|
break;
|
||||||
|
case svc_roomtype:
|
||||||
|
param1 = MSG_ReadShort( msg );
|
||||||
|
Cvar_SetValue( "room_type", param1 );
|
||||||
|
break;
|
||||||
|
case svc_director:
|
||||||
|
CL_ParseDirector( msg );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=====================
|
=====================
|
||||||
CL_ParseServerMessage
|
CL_ParseServerMessage
|
||||||
|
@ -2398,7 +2446,7 @@ dispatch messages
|
||||||
void CL_ParseServerMessage( sizebuf_t *msg )
|
void CL_ParseServerMessage( sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
size_t bufStart, playerbytes;
|
size_t bufStart, playerbytes;
|
||||||
int cmd, param1, param2;
|
int cmd;
|
||||||
int old_background;
|
int old_background;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
|
@ -2423,6 +2471,9 @@ void CL_ParseServerMessage( sizebuf_t *msg )
|
||||||
// record command for debugging spew on parse problem
|
// record command for debugging spew on parse problem
|
||||||
CL_Parse_RecordCommand( cmd, bufStart );
|
CL_Parse_RecordCommand( cmd, bufStart );
|
||||||
|
|
||||||
|
if( CL_ParseCommonDLLMessage( msg, PROTO_CURRENT, cmd, bufStart ))
|
||||||
|
continue;
|
||||||
|
|
||||||
// other commands
|
// other commands
|
||||||
switch( cmd )
|
switch( cmd )
|
||||||
{
|
{
|
||||||
|
@ -2550,10 +2601,6 @@ void CL_ParseServerMessage( sizebuf_t *msg )
|
||||||
case svc_spawnbaseline:
|
case svc_spawnbaseline:
|
||||||
CL_ParseBaseline( msg, PROTO_CURRENT );
|
CL_ParseBaseline( msg, PROTO_CURRENT );
|
||||||
break;
|
break;
|
||||||
case svc_temp_entity:
|
|
||||||
CL_ParseTempEntity( msg, PROTO_CURRENT );
|
|
||||||
cl.frames[cl.parsecountmod].graphdata.tentities += MSG_GetNumBytesRead( msg ) - bufStart;
|
|
||||||
break;
|
|
||||||
case svc_setpause:
|
case svc_setpause:
|
||||||
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
||||||
break;
|
break;
|
||||||
|
@ -2563,37 +2610,18 @@ void CL_ParseServerMessage( sizebuf_t *msg )
|
||||||
case svc_centerprint:
|
case svc_centerprint:
|
||||||
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
||||||
break;
|
break;
|
||||||
case svc_intermission:
|
|
||||||
cl.intermission = 1;
|
|
||||||
break;
|
|
||||||
case svc_finale:
|
case svc_finale:
|
||||||
CL_ParseFinaleCutscene( msg, 2 );
|
CL_ParseFinaleCutscene( msg, 2 );
|
||||||
break;
|
break;
|
||||||
case svc_cdtrack:
|
|
||||||
param1 = MSG_ReadByte( msg );
|
|
||||||
param1 = bound( 1, param1, MAX_CDTRACKS ); // tracknum
|
|
||||||
param2 = MSG_ReadByte( msg );
|
|
||||||
param2 = bound( 1, param2, MAX_CDTRACKS ); // loopnum
|
|
||||||
S_StartBackgroundTrack( clgame.cdtracks[param1-1], clgame.cdtracks[param2-1], 0, false );
|
|
||||||
break;
|
|
||||||
case svc_restore:
|
case svc_restore:
|
||||||
CL_ParseRestore( msg );
|
CL_ParseRestore( msg );
|
||||||
break;
|
break;
|
||||||
case svc_cutscene:
|
case svc_cutscene:
|
||||||
CL_ParseFinaleCutscene( msg, 3 );
|
CL_ParseFinaleCutscene( msg, 3 );
|
||||||
break;
|
break;
|
||||||
case svc_weaponanim:
|
|
||||||
param1 = MSG_ReadByte( msg ); // iAnim
|
|
||||||
param2 = MSG_ReadByte( msg ); // body
|
|
||||||
CL_WeaponAnim( param1, param2 );
|
|
||||||
break;
|
|
||||||
case svc_bspdecal:
|
case svc_bspdecal:
|
||||||
CL_ParseStaticDecal( msg );
|
CL_ParseStaticDecal( msg );
|
||||||
break;
|
break;
|
||||||
case svc_roomtype:
|
|
||||||
param1 = MSG_ReadShort( msg );
|
|
||||||
Cvar_SetValue( "room_type", param1 );
|
|
||||||
break;
|
|
||||||
case svc_addangle:
|
case svc_addangle:
|
||||||
CL_ParseAddAngle( msg );
|
CL_ParseAddAngle( msg );
|
||||||
break;
|
break;
|
||||||
|
@ -2638,9 +2666,6 @@ void CL_ParseServerMessage( sizebuf_t *msg )
|
||||||
case svc_hltv:
|
case svc_hltv:
|
||||||
CL_ParseHLTV( msg );
|
CL_ParseHLTV( msg );
|
||||||
break;
|
break;
|
||||||
case svc_director:
|
|
||||||
CL_ParseDirector( msg );
|
|
||||||
break;
|
|
||||||
case svc_voiceinit:
|
case svc_voiceinit:
|
||||||
CL_ParseVoiceInit( msg );
|
CL_ParseVoiceInit( msg );
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -137,12 +137,7 @@ static void CL_LegacyParseSoundPacket( sizebuf_t *msg, qboolean is_ambient )
|
||||||
if( FBitSet( flags, SND_SENTENCE ))
|
if( FBitSet( flags, SND_SENTENCE ))
|
||||||
{
|
{
|
||||||
char sentenceName[32];
|
char sentenceName[32];
|
||||||
|
|
||||||
//if( FBitSet( flags, SND_SEQUENCE ))
|
|
||||||
//Q_snprintf( sentenceName, sizeof( sentenceName ), "!#%i", sound + MAX_SOUNDS );
|
|
||||||
//else
|
|
||||||
Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound );
|
Q_snprintf( sentenceName, sizeof( sentenceName ), "!%i", sound );
|
||||||
|
|
||||||
handle = S_RegisterSound( sentenceName );
|
handle = S_RegisterSound( sentenceName );
|
||||||
}
|
}
|
||||||
else handle = cl.sound_index[sound]; // see precached sound
|
else handle = cl.sound_index[sound]; // see precached sound
|
||||||
|
@ -320,7 +315,7 @@ dispatch messages
|
||||||
void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
size_t bufStart, playerbytes;
|
size_t bufStart, playerbytes;
|
||||||
int cmd, param1, param2;
|
int cmd;
|
||||||
int old_background;
|
int old_background;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
|
@ -345,6 +340,9 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
||||||
// record command for debugging spew on parse problem
|
// record command for debugging spew on parse problem
|
||||||
CL_Parse_RecordCommand( cmd, bufStart );
|
CL_Parse_RecordCommand( cmd, bufStart );
|
||||||
|
|
||||||
|
if( CL_ParseCommonDLLMessage( msg, PROTO_LEGACY, cmd, bufStart ))
|
||||||
|
continue;
|
||||||
|
|
||||||
// other commands
|
// other commands
|
||||||
switch( cmd )
|
switch( cmd )
|
||||||
{
|
{
|
||||||
|
@ -484,10 +482,6 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
||||||
case svc_spawnbaseline:
|
case svc_spawnbaseline:
|
||||||
CL_ParseBaseline( msg, PROTO_LEGACY );
|
CL_ParseBaseline( msg, PROTO_LEGACY );
|
||||||
break;
|
break;
|
||||||
case svc_temp_entity:
|
|
||||||
CL_ParseTempEntity( msg, PROTO_LEGACY );
|
|
||||||
cl.frames[cl.parsecountmod].graphdata.tentities += MSG_GetNumBytesRead( msg ) - bufStart;
|
|
||||||
break;
|
|
||||||
case svc_setpause:
|
case svc_setpause:
|
||||||
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
||||||
break;
|
break;
|
||||||
|
@ -497,40 +491,21 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
||||||
case svc_centerprint:
|
case svc_centerprint:
|
||||||
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
CL_CenterPrint( MSG_ReadString( msg ), 0.25f );
|
||||||
break;
|
break;
|
||||||
case svc_intermission:
|
|
||||||
cl.intermission = 1;
|
|
||||||
break;
|
|
||||||
case svc_legacy_modelindex:
|
case svc_legacy_modelindex:
|
||||||
CL_LegacyPrecacheModel( msg );
|
CL_LegacyPrecacheModel( msg );
|
||||||
break;
|
break;
|
||||||
case svc_legacy_soundindex:
|
case svc_legacy_soundindex:
|
||||||
CL_LegacyPrecacheSound( msg );
|
CL_LegacyPrecacheSound( msg );
|
||||||
break;
|
break;
|
||||||
case svc_cdtrack:
|
|
||||||
param1 = MSG_ReadByte( msg );
|
|
||||||
param1 = bound( 1, param1, MAX_CDTRACKS ); // tracknum
|
|
||||||
param2 = MSG_ReadByte( msg );
|
|
||||||
param2 = bound( 1, param2, MAX_CDTRACKS ); // loopnum
|
|
||||||
S_StartBackgroundTrack( clgame.cdtracks[param1-1], clgame.cdtracks[param2-1], 0, false );
|
|
||||||
break;
|
|
||||||
case svc_restore:
|
case svc_restore:
|
||||||
CL_ParseRestore( msg );
|
CL_ParseRestore( msg );
|
||||||
break;
|
break;
|
||||||
case svc_legacy_eventindex:
|
case svc_legacy_eventindex:
|
||||||
CL_LegacyPrecacheEvent(msg);
|
CL_LegacyPrecacheEvent(msg);
|
||||||
break;
|
break;
|
||||||
case svc_weaponanim:
|
|
||||||
param1 = MSG_ReadByte( msg ); // iAnim
|
|
||||||
param2 = MSG_ReadByte( msg ); // body
|
|
||||||
CL_WeaponAnim( param1, param2 );
|
|
||||||
break;
|
|
||||||
case svc_bspdecal:
|
case svc_bspdecal:
|
||||||
CL_ParseStaticDecal( msg );
|
CL_ParseStaticDecal( msg );
|
||||||
break;
|
break;
|
||||||
case svc_roomtype:
|
|
||||||
param1 = MSG_ReadShort( msg );
|
|
||||||
Cvar_SetValue( "room_type", param1 );
|
|
||||||
break;
|
|
||||||
case svc_addangle:
|
case svc_addangle:
|
||||||
CL_ParseAddAngle( msg );
|
CL_ParseAddAngle( msg );
|
||||||
break;
|
break;
|
||||||
|
@ -590,9 +565,6 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg )
|
||||||
case svc_hltv:
|
case svc_hltv:
|
||||||
CL_ParseHLTV( msg );
|
CL_ParseHLTV( msg );
|
||||||
break;
|
break;
|
||||||
case svc_director:
|
|
||||||
CL_ParseDirector( msg );
|
|
||||||
break;
|
|
||||||
case svc_resourcelocation:
|
case svc_resourcelocation:
|
||||||
CL_ParseResLocation( msg );
|
CL_ParseResLocation( msg );
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -530,7 +530,7 @@ dispatch messages
|
||||||
void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
||||||
{
|
{
|
||||||
size_t bufStart, playerbytes;
|
size_t bufStart, playerbytes;
|
||||||
int cmd, param1, param2;
|
int cmd;
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
||||||
// parse the message
|
// parse the message
|
||||||
|
@ -554,6 +554,9 @@ void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
||||||
// record command for debugging spew on parse problem
|
// record command for debugging spew on parse problem
|
||||||
CL_Parse_RecordCommand( cmd, bufStart );
|
CL_Parse_RecordCommand( cmd, bufStart );
|
||||||
|
|
||||||
|
if( CL_ParseCommonDLLMessage( msg, PROTO_GOLDSRC, cmd, bufStart ))
|
||||||
|
continue;
|
||||||
|
|
||||||
// other commands
|
// other commands
|
||||||
switch( cmd )
|
switch( cmd )
|
||||||
{
|
{
|
||||||
|
@ -647,9 +650,6 @@ void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
||||||
case svc_spawnbaseline:
|
case svc_spawnbaseline:
|
||||||
CL_ParseBaseline( msg, PROTO_GOLDSRC );
|
CL_ParseBaseline( msg, PROTO_GOLDSRC );
|
||||||
break;
|
break;
|
||||||
case svc_temp_entity:
|
|
||||||
CL_ParseTempEntity( msg, PROTO_GOLDSRC );
|
|
||||||
cl.frames[cl.parsecountmod].graphdata.tentities += MSG_GetNumBytesRead( msg ) - bufStart;
|
|
||||||
break;
|
break;
|
||||||
case svc_setpause:
|
case svc_setpause:
|
||||||
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
cl.paused = ( MSG_ReadOneBit( msg ) != 0 );
|
||||||
|
@ -663,34 +663,15 @@ void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
||||||
case svc_goldsrc_spawnstaticsound:
|
case svc_goldsrc_spawnstaticsound:
|
||||||
CL_ParseSpawnStaticSound( msg );
|
CL_ParseSpawnStaticSound( msg );
|
||||||
break;
|
break;
|
||||||
case svc_intermission:
|
|
||||||
cl.intermission = 1;
|
|
||||||
break;
|
|
||||||
case svc_finale:
|
case svc_finale:
|
||||||
CL_ParseFinaleCutscene( msg, 2 );
|
CL_ParseFinaleCutscene( msg, 2 );
|
||||||
break;
|
break;
|
||||||
case svc_cdtrack:
|
|
||||||
param1 = MSG_ReadByte( msg );
|
|
||||||
param1 = bound( 1, param1, MAX_CDTRACKS ); // tracknum
|
|
||||||
param2 = MSG_ReadByte( msg );
|
|
||||||
param2 = bound( 1, param2, MAX_CDTRACKS ); // loopnum
|
|
||||||
S_StartBackgroundTrack( clgame.cdtracks[param1-1], clgame.cdtracks[param2-1], 0, false );
|
|
||||||
break;
|
|
||||||
case svc_restore:
|
case svc_restore:
|
||||||
CL_ParseRestore( msg );
|
CL_ParseRestore( msg );
|
||||||
break;
|
break;
|
||||||
case svc_cutscene:
|
case svc_cutscene:
|
||||||
CL_ParseFinaleCutscene( msg, 3 );
|
CL_ParseFinaleCutscene( msg, 3 );
|
||||||
break;
|
break;
|
||||||
case svc_weaponanim:
|
|
||||||
param1 = MSG_ReadByte( msg ); // iAnim
|
|
||||||
param2 = MSG_ReadByte( msg ); // body
|
|
||||||
CL_WeaponAnim( param1, param2 );
|
|
||||||
break;
|
|
||||||
case svc_roomtype:
|
|
||||||
param1 = MSG_ReadShort( msg );
|
|
||||||
Cvar_SetValue( "room_type", param1 );
|
|
||||||
break;
|
|
||||||
case svc_addangle:
|
case svc_addangle:
|
||||||
CL_ParseAddAngle( msg );
|
CL_ParseAddAngle( msg );
|
||||||
break;
|
break;
|
||||||
|
@ -737,9 +718,6 @@ void CL_ParseGoldSrcServerMessage( sizebuf_t *msg )
|
||||||
case svc_hltv:
|
case svc_hltv:
|
||||||
CL_ParseHLTV( msg );
|
CL_ParseHLTV( msg );
|
||||||
break;
|
break;
|
||||||
case svc_director:
|
|
||||||
CL_ParseDirector( msg );
|
|
||||||
break;
|
|
||||||
case svc_voiceinit:
|
case svc_voiceinit:
|
||||||
CL_ParseVoiceInit( msg );
|
CL_ParseVoiceInit( msg );
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -890,6 +890,7 @@ void CL_ParseVoiceData( sizebuf_t *msg, connprotocol_t proto );
|
||||||
void CL_ParseResLocation( sizebuf_t *msg );
|
void CL_ParseResLocation( sizebuf_t *msg );
|
||||||
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext, const connprotocol_t proto );
|
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext, const connprotocol_t proto );
|
||||||
void CL_ParseServerMessage( sizebuf_t *msg );
|
void CL_ParseServerMessage( sizebuf_t *msg );
|
||||||
|
qboolean CL_ParseCommonDLLMessage( sizebuf_t *msg, connprotocol_t proto, int svc_num, int startoffset );
|
||||||
void CL_ParseTempEntity( sizebuf_t *msg, connprotocol_t proto );
|
void CL_ParseTempEntity( sizebuf_t *msg, connprotocol_t proto );
|
||||||
qboolean CL_DispatchUserMessage( const char *pszName, int iSize, void *pbuf );
|
qboolean CL_DispatchUserMessage( const char *pszName, int iSize, void *pbuf );
|
||||||
qboolean CL_RequestMissingResources( void );
|
qboolean CL_RequestMissingResources( void );
|
||||||
|
|
Loading…
Add table
Reference in a new issue