Alibek Omarov
7 years ago
42 changed files with 1954 additions and 489 deletions
@ -0,0 +1,242 @@ |
|||||||
|
/*
|
||||||
|
cl_debug.c - server message debugging |
||||||
|
Copyright (C) 2018 Uncle Mike |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "common.h" |
||||||
|
#include "client.h" |
||||||
|
#include "net_encode.h" |
||||||
|
#include "particledef.h" |
||||||
|
#include "gl_local.h" |
||||||
|
#include "cl_tent.h" |
||||||
|
#include "shake.h" |
||||||
|
#include "hltv.h" |
||||||
|
#include "input.h" |
||||||
|
|
||||||
|
#define MSG_COUNT 32 // last 32 messages parsed
|
||||||
|
#define MSG_MASK (MSG_COUNT - 1) |
||||||
|
|
||||||
|
const char *svc_strings[svc_lastmsg+1] = |
||||||
|
{ |
||||||
|
"svc_bad", |
||||||
|
"svc_nop", |
||||||
|
"svc_disconnect", |
||||||
|
"svc_event", |
||||||
|
"svc_changing", |
||||||
|
"svc_setview", |
||||||
|
"svc_sound", |
||||||
|
"svc_time", |
||||||
|
"svc_print", |
||||||
|
"svc_stufftext", |
||||||
|
"svc_setangle", |
||||||
|
"svc_serverdata", |
||||||
|
"svc_lightstyle", |
||||||
|
"svc_updateuserinfo", |
||||||
|
"svc_deltatable", |
||||||
|
"svc_clientdata", |
||||||
|
"svc_resource", |
||||||
|
"svc_pings", |
||||||
|
"svc_particle", |
||||||
|
"svc_restoresound", |
||||||
|
"svc_spawnstatic", |
||||||
|
"svc_event_reliable", |
||||||
|
"svc_spawnbaseline", |
||||||
|
"svc_temp_entity", |
||||||
|
"svc_setpause", |
||||||
|
"svc_signonnum", |
||||||
|
"svc_centerprint", |
||||||
|
"svc_unused27", |
||||||
|
"svc_unused28", |
||||||
|
"svc_unused29", |
||||||
|
"svc_intermission", |
||||||
|
"svc_finale", |
||||||
|
"svc_cdtrack", |
||||||
|
"svc_restore", |
||||||
|
"svc_cutscene", |
||||||
|
"svc_weaponanim", |
||||||
|
"svc_bspdecal", |
||||||
|
"svc_roomtype", |
||||||
|
"svc_addangle", |
||||||
|
"svc_usermessage", |
||||||
|
"svc_packetentities", |
||||||
|
"svc_deltapacketentities", |
||||||
|
"svc_choke", |
||||||
|
"svc_resourcelist", |
||||||
|
"svc_deltamovevars", |
||||||
|
"svc_resourcerequest", |
||||||
|
"svc_customization", |
||||||
|
"svc_crosshairangle", |
||||||
|
"svc_soundfade", |
||||||
|
"svc_filetxferfailed", |
||||||
|
"svc_hltv", |
||||||
|
"svc_director", |
||||||
|
"svc_voiceinit", |
||||||
|
"svc_voicedata", |
||||||
|
"svc_unused54", |
||||||
|
"svc_unused55", |
||||||
|
"svc_resourcelocation", |
||||||
|
"svc_querycvarvalue", |
||||||
|
"svc_querycvarvalue2", |
||||||
|
}; |
||||||
|
|
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
int command; |
||||||
|
int starting_offset; |
||||||
|
int frame_number; |
||||||
|
} oldcmd_t; |
||||||
|
|
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
oldcmd_t oldcmd[MSG_COUNT]; |
||||||
|
int currentcmd; |
||||||
|
qboolean parsing; |
||||||
|
} msg_debug_t; |
||||||
|
|
||||||
|
static msg_debug_t cls_message_debug; |
||||||
|
|
||||||
|
const char *CL_MsgInfo( int cmd ) |
||||||
|
{ |
||||||
|
static string sz; |
||||||
|
|
||||||
|
Q_strcpy( sz, "???" ); |
||||||
|
|
||||||
|
if( cmd >= 0 && cmd <= svc_lastmsg ) |
||||||
|
{ |
||||||
|
// get engine message name
|
||||||
|
Q_strncpy( sz, svc_strings[cmd], sizeof( sz )); |
||||||
|
} |
||||||
|
else if( cmd > svc_lastmsg && cmd <= ( svc_lastmsg + MAX_USER_MESSAGES )) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
|
||||||
|
for( i = 0; i < MAX_USER_MESSAGES; i++ ) |
||||||
|
{ |
||||||
|
if( clgame.msg[i].number == cmd ) |
||||||
|
{ |
||||||
|
Q_strncpy( sz, clgame.msg[i].name, sizeof( sz )); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return sz; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
===================== |
||||||
|
CL_Parse_Debug |
||||||
|
|
||||||
|
enable message debugging |
||||||
|
===================== |
||||||
|
*/ |
||||||
|
void CL_Parse_Debug( qboolean enable ) |
||||||
|
{ |
||||||
|
cls_message_debug.parsing = enable; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
===================== |
||||||
|
CL_Parse_RecordCommand |
||||||
|
|
||||||
|
record new message params into debug buffer |
||||||
|
===================== |
||||||
|
*/ |
||||||
|
void CL_Parse_RecordCommand( int cmd, int startoffset ) |
||||||
|
{ |
||||||
|
int slot; |
||||||
|
|
||||||
|
if( cmd == svc_nop ) return; |
||||||
|
|
||||||
|
slot = ( cls_message_debug.currentcmd++ & MSG_MASK ); |
||||||
|
cls_message_debug.oldcmd[slot].command = cmd; |
||||||
|
cls_message_debug.oldcmd[slot].starting_offset = startoffset; |
||||||
|
cls_message_debug.oldcmd[slot].frame_number = host.framecount; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
===================== |
||||||
|
CL_ResetFrame |
||||||
|
===================== |
||||||
|
*/ |
||||||
|
void CL_ResetFrame( frame_t *frame ) |
||||||
|
{ |
||||||
|
memset( &frame->graphdata, 0, sizeof( netbandwidthgraph_t )); |
||||||
|
frame->receivedtime = host.realtime; |
||||||
|
frame->valid = true; |
||||||
|
frame->choked = false; |
||||||
|
frame->latency = 0.0; |
||||||
|
frame->time = cl.mtime[0]; |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
===================== |
||||||
|
CL_WriteErrorMessage |
||||||
|
|
||||||
|
write net_message into buffer.dat for debugging |
||||||
|
===================== |
||||||
|
*/ |
||||||
|
static void CL_WriteErrorMessage( int current_count, sizebuf_t *msg ) |
||||||
|
{ |
||||||
|
const char *buffer_file = "buffer.dat"; |
||||||
|
file_t *fp; |
||||||
|
|
||||||
|
fp = FS_Open( buffer_file, "wb", false ); |
||||||
|
if( !fp ) return; |
||||||
|
|
||||||
|
FS_Write( fp, &cls.starting_count, sizeof( int )); |
||||||
|
FS_Write( fp, ¤t_count, sizeof( int )); |
||||||
|
FS_Write( fp, MSG_GetData( msg ), MSG_GetMaxBytes( msg )); |
||||||
|
FS_Close( fp ); |
||||||
|
|
||||||
|
Con_Printf( "Wrote erroneous message to %s\n", buffer_file ); |
||||||
|
} |
||||||
|
|
||||||
|
/*
|
||||||
|
===================== |
||||||
|
CL_WriteMessageHistory |
||||||
|
|
||||||
|
list last 32 messages for debugging net troubleshooting |
||||||
|
===================== |
||||||
|
*/ |
||||||
|
void CL_WriteMessageHistory( void ) |
||||||
|
{ |
||||||
|
oldcmd_t *old, *failcommand; |
||||||
|
sizebuf_t *msg = &net_message; |
||||||
|
int i, thecmd; |
||||||
|
|
||||||
|
if( !cls.initialized || cls.state == ca_disconnected ) |
||||||
|
return; |
||||||
|
|
||||||
|
if( !cls_message_debug.parsing ) |
||||||
|
return; |
||||||
|
|
||||||
|
Con_Printf( "Last %i messages parsed.\n", MSG_COUNT ); |
||||||
|
|
||||||
|
// finish here
|
||||||
|
thecmd = cls_message_debug.currentcmd - 1; |
||||||
|
thecmd -= ( MSG_COUNT - 1 ); // back up to here
|
||||||
|
|
||||||
|
for( i = 0; i < MSG_COUNT - 1; i++ ) |
||||||
|
{ |
||||||
|
thecmd &= MSG_MASK; |
||||||
|
old = &cls_message_debug.oldcmd[thecmd]; |
||||||
|
Con_Printf( "%i %04i %s\n", old->frame_number, old->starting_offset, CL_MsgInfo( old->command )); |
||||||
|
thecmd++; |
||||||
|
} |
||||||
|
|
||||||
|
failcommand = &cls_message_debug.oldcmd[thecmd]; |
||||||
|
Con_Printf( "BAD: %3i:%s\n", MSG_GetNumBytesRead( msg ) - 1, CL_MsgInfo( failcommand->command )); |
||||||
|
if( host_developer.value >= DEV_EXTENDED ) |
||||||
|
CL_WriteErrorMessage( MSG_GetNumBytesRead( msg ) - 1, msg ); |
||||||
|
cls_message_debug.parsing = false; |
||||||
|
} |
Loading…
Reference in new issue