diff --git a/engine/server/server.h b/engine/server/server.h index be144a9b..3c516372 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -325,6 +325,7 @@ typedef struct qboolean msg_started; // to avoid recursive included messages edict_t *msg_ent; // user message member entity vec3_t msg_org; // user message member origin + qboolean msg_trace; // trace this message void *hInstance; // pointer to game.dll qboolean config_executed; // should to execute config.cfg once time to restore FCVAR_ARCHIVE that specified in hl.dll @@ -431,6 +432,7 @@ extern convar_t sv_skyvec_z; extern convar_t sv_consistency; extern convar_t sv_password; extern convar_t sv_uploadmax; +extern convar_t sv_trace_messages; extern convar_t deathmatch; extern convar_t hostname; extern convar_t skill; diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 0f9239f0..7ed36bcb 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -2608,6 +2608,13 @@ void GAME_EXPORT pfnMessageBegin( int msg_dest, int msg_num, const float *pOrigi svgame.msg_realsize = 0; svgame.msg_dest = msg_dest; svgame.msg_ent = ed; + + // enable message tracing + svgame.msg_trace = sv_trace_messages.value != 0 && + msg_num > svc_lastmsg && + Q_strcmp( svgame.msg_name, "ReqState" ); + + if( svgame.msg_trace ) Con_Printf( "^3%s( %i, %s )\n", __FUNCTION__, msg_dest, svgame.msg_name ); } /* @@ -2706,6 +2713,8 @@ void GAME_EXPORT pfnMessageEnd( void ) svgame.msg_dest = bound( MSG_BROADCAST, svgame.msg_dest, MSG_SPEC ); SV_Multicast( svgame.msg_dest, org, svgame.msg_ent, true, false ); + + if( svgame.msg_trace ) Con_Printf( "^3%s()\n", __FUNCTION__, svgame.msg_dest, svgame.msg_name ); } /* @@ -2718,6 +2727,7 @@ void GAME_EXPORT pfnWriteByte( int iValue ) { if( iValue == -1 ) iValue = 0xFF; // convert char to byte MSG_WriteByte( &sv.multicast, (byte)iValue ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %i )", __FUNCTION__, iValue ); svgame.msg_realsize++; } @@ -2730,6 +2740,7 @@ pfnWriteChar void GAME_EXPORT pfnWriteChar( int iValue ) { MSG_WriteChar( &sv.multicast, (signed char)iValue ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %i )", __FUNCTION__, iValue ); svgame.msg_realsize++; } @@ -2742,6 +2753,7 @@ pfnWriteShort void GAME_EXPORT pfnWriteShort( int iValue ) { MSG_WriteShort( &sv.multicast, (short)iValue ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %i )", __FUNCTION__, iValue ); svgame.msg_realsize += 2; } @@ -2754,6 +2766,7 @@ pfnWriteLong void GAME_EXPORT pfnWriteLong( int iValue ) { MSG_WriteLong( &sv.multicast, iValue ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %i )", __FUNCTION__, iValue ); svgame.msg_realsize += 4; } @@ -2769,6 +2782,7 @@ void GAME_EXPORT pfnWriteAngle( float flValue ) int iAngle = ((int)(( flValue ) * 256 / 360) & 255); MSG_WriteChar( &sv.multicast, iAngle ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %f )", __FUNCTION__, flValue ); svgame.msg_realsize += 1; } @@ -2781,6 +2795,7 @@ pfnWriteCoord void GAME_EXPORT pfnWriteCoord( float flValue ) { MSG_WriteCoord( &sv.multicast, flValue ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %f )", __FUNCTION__, flValue ); svgame.msg_realsize += 2; } @@ -2793,6 +2808,7 @@ pfnWriteBytes void pfnWriteBytes( const byte *bytes, int count ) { MSG_WriteBytes( &sv.multicast, bytes, count ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %i )", __FUNCTION__, count ); svgame.msg_realsize += count; } @@ -2854,6 +2870,7 @@ void GAME_EXPORT pfnWriteString( const char *src ) *dst = '\0'; // string end (not included in count) MSG_WriteString( &sv.multicast, string ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %s )", __FUNCTION__, string ); // NOTE: some messages with constant string length can be marked as known sized svgame.msg_realsize += len; @@ -2870,6 +2887,7 @@ void GAME_EXPORT pfnWriteEntity( int iValue ) if( iValue < 0 || iValue >= svgame.numEntities ) Host_Error( "MSG_WriteEntity: invalid entnumber %i\n", iValue ); MSG_WriteShort( &sv.multicast, (short)iValue ); + if( svgame.msg_trace ) Con_Printf( "\t^3%s( %i )", __FUNCTION__, iValue ); svgame.msg_realsize += 2; } diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 5639dd44..071164a3 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -55,6 +55,7 @@ CVAR_DEFINE_AUTO( mp_logecho, "1", 0, "log multiplayer frags to server logfile" CVAR_DEFINE_AUTO( mp_logfile, "1", 0, "log multiplayer frags to console" ); CVAR_DEFINE_AUTO( sv_log_singleplayer, "0", FCVAR_ARCHIVE, "allows logging in singleplayer games" ); CVAR_DEFINE_AUTO( sv_log_onefile, "0", FCVAR_ARCHIVE, "logs server information to only one file" ); +CVAR_DEFINE_AUTO( sv_trace_messages, "0", FCVAR_LATCH, "enable server usermessages tracing (good for developers)" ); // game-related cvars CVAR_DEFINE_AUTO( mapcyclefile, "mapcycle.txt", 0, "name of multiplayer map cycle configuration file" ); @@ -946,6 +947,8 @@ void SV_Init( void ) Cvar_RegisterVariable( &listipcfgfile ); Cvar_RegisterVariable( &mapchangecfgfile ); + Cvar_RegisterVariable( &sv_trace_messages ); + sv_allow_joystick = Cvar_Get( "sv_allow_joystick", "1", FCVAR_ARCHIVE, "allow connect with joystick enabled" ); sv_allow_mouse = Cvar_Get( "sv_allow_mouse", "1", FCVAR_ARCHIVE, "allow connect with mouse" ); sv_allow_touch = Cvar_Get( "sv_allow_touch", "1", FCVAR_ARCHIVE, "allow connect with touch controls" );