2525#define SERVERINFO_REQUEST 79
2626#define SERVERINFO_RESPONSE 80
2727#define SERVERINFO_VERSION 1
28- #define SERVERINFO_VERSION_KEYED 4
28+ #define SERVERINFO_VERSION_KEYED 5
2929#define TEAM_IMC "imc"
3030#define TEAM_MILITIA "militia"
3131#define TEAM_UNKNOWN "unknown"
@@ -79,7 +79,7 @@ pkt_rule(struct qserver *server, char **pkt, int *rem, char *rule)
7979
8080
8181static query_status_t
82- pkt_data (struct qserver * server , char * * pkt , int * rem , void * data , char * rule , int size )
82+ pkt_data (struct qserver * server , char * * pkt , int * rem , void * data , char * rule , int size , int isfloat )
8383{
8484 if (* rem - size < 0 ) {
8585 malformed_packet (server , "short packet data" );
@@ -102,7 +102,11 @@ pkt_data(struct qserver *server, char **pkt, int *rem, void *data, char *rule, i
102102 break ;
103103
104104 case 4 :
105- sprintf (buf , "%" PRIu32 , * (uint32_t * )data );
105+ if (isfloat ) {
106+ sprintf (buf , "%f" , * (float * )data );
107+ } else {
108+ sprintf (buf , "%" PRIu32 , * (uint32_t * )data );
109+ }
106110 break ;
107111
108112 case 8 :
@@ -119,30 +123,35 @@ pkt_data(struct qserver *server, char **pkt, int *rem, void *data, char *rule, i
119123static query_status_t
120124pkt_byte (struct qserver * server , char * * pkt , int * rem , uint8_t * data , char * rule )
121125{
122- return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data )));
126+ return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data ), 0 ));
123127}
124128
125129
126130static query_status_t
127131pkt_short (struct qserver * server , char * * pkt , int * rem , uint16_t * data , char * rule )
128132{
129- return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data )));
133+ return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data ), 0 ));
130134}
131135
132136
133137static query_status_t
134138pkt_long (struct qserver * server , char * * pkt , int * rem , uint32_t * data , char * rule )
135139{
136- return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data )));
140+ return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data ), 0 ));
137141}
138142
139143
140144static query_status_t
141145pkt_longlong (struct qserver * server , char * * pkt , int * rem , uint64_t * data , char * rule )
142146{
143- return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data )));
147+ return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data ), 0 ));
144148}
145149
150+ static query_status_t
151+ pkt_float (struct qserver * server , char * * pkt , int * rem , float * data , char * rule )
152+ {
153+ return (pkt_data (server , pkt , rem , (void * )data , rule , sizeof (* data ), 1 ));
154+ }
146155
147156query_status_t
148157send_tf_request_packet (struct qserver * server )
@@ -186,6 +195,7 @@ deal_with_tf_packet(struct qserver *server, char *rawpkt, int pktlen)
186195 uint16_t port , tmpu16 ;
187196 uint32_t tmpu32 ;
188197 uint64_t tmpu64 ;
198+ float tmpf ;
189199
190200 rem = pktlen ;
191201 pkt = rawpkt ;
@@ -326,6 +336,28 @@ deal_with_tf_packet(struct qserver *server, char *rawpkt, int pktlen)
326336 return (ret );
327337 }
328338
339+ if (ver > 4 ) {
340+ ret = pkt_float (server , & pkt , & rem , & tmpf , "avg_frame_time" );
341+ if (ret < 0 ) {
342+ return (ret );
343+ }
344+
345+ ret = pkt_float (server , & pkt , & rem , & tmpf , "max_frame_time" );
346+ if (ret < 0 ) {
347+ return (ret );
348+ }
349+
350+ ret = pkt_float (server , & pkt , & rem , & tmpf , "avg_user_cmd_time" );
351+ if (ret < 0 ) {
352+ return (ret );
353+ }
354+
355+ ret = pkt_float (server , & pkt , & rem , & tmpf , "max_user_cmd_time" );
356+ if (ret < 0 ) {
357+ return (ret );
358+ }
359+ }
360+
329361 if (ver > 2 ) {
330362 // Phase (byte)
331363 ret = pkt_byte (server , & pkt , & rem , & tmpu8 , "phase" );
0 commit comments