1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
|
/*
* qstat.h
* by Steve Jankowski
* steve@activesw.com
* http://www.activesw.com/people/steve/qstat.html
*
* Copyright 1996,1997 by Steve Jankowski
*/
/* Various magic numbers.
*/
#define MAXFD_DEFAULT 20
#define DEFAULT_PORT 26000
#define HEXEN2_DEFAULT_PORT 26900
#define QUAKE2_DEFAULT_PORT 27910
#define DEFAULT_RETRIES 3
#define DEFAULT_RETRY_INTERVAL 500 /* milli-seconds */
#define MAXIP 4
/* Structures for keeping information about Quake servers, server
* rules, and players.
*/
struct player;
#define Q_UNKNOWN_TYPE 0
#define Q_SERVER 1
#define QW_SERVER 2
#define QW_MASTER 4
#define H2_SERVER 8
#define Q2_SERVER 16
#define F_USERS_BACKSLASH 0x1
#define F_SEEN_BACKSLASH 0x2
struct qserver {
char *arg;
char *host_name;
struct in_addr ip[MAXIP];
int type;
int fd;
unsigned short port;
int retry1;
int retry2;
int n_retries;
struct timeval packet_time1;
struct timeval packet_time2;
int ping_total; /* average is ping_total / n_requests */
int n_requests;
int n_packets;
int n_servers;
char *error;
char *server_name;
char *address;
char *map_name;
int max_players;
int num_players;
int protocol_version;
int next_player_info;
int n_player_info;
struct player *players;
char *next_rule;
int n_rules;
struct rule *rules;
int missing_rules;
struct qserver *next;
};
struct player {
int number;
char *name;
int frags;
int connect_time;
int shirt_color;
int pants_color;
char *address;
int ping;
char *skin;
struct player *next;
};
struct rule {
char *name;
char *value;
struct rule *next;
};
struct qw_user {
char *uid;
char *name;
char *efficiency;
char *frags;
char *rank;
char *deaths;
char *skill;
int n_info;
struct {
char *key;
char *value;
} info[20];
char *error;
};
/* Definitions for the original Quake network protocol.
*/
#define PACKET_LEN 0xffff
/* Quake packet formats and magic numbers
*/
struct qheader {
unsigned char flag1;
unsigned char flag2;
unsigned short length;
unsigned char op_code;
};
struct qpacket {
unsigned char flag1;
unsigned char flag2;
unsigned short length;
unsigned char op_code;
unsigned char data[1500];
};
#define Q_FLAG1 0x80
#define Q_FLAG2 0x00
#define Q_NET_PROTOCOL_VERSION 3
#define HEXEN2_NET_PROTOCOL_VERSION 4
#define Q_HEADER_SIZE 5
#define Q_CCREQ_CONNECT 0x01
#define Q_CCREP_ACCEPT 0x81
#define Q_CCREP_REJECT 0x82
#define Q_CCREQ_SERVER_INFO 0x02
#define Q_CCREP_SERVER_INFO 0x83
#define Q_CCREQ_PLAYER_INFO 0x03
#define Q_CCREP_PLAYER_INFO 0x84
#define Q_CCREQ_RULE_INFO 0x04
#define Q_CCREP_RULE_INFO 0x85
#define Q_DEFAULT_SV_MAXSPEED "320"
#define Q_DEFAULT_SV_FRICTION "4"
#define Q_DEFAULT_SV_GRAVITY "800"
#define Q_DEFAULT_NOEXIT "0"
#define Q_DEFAULT_TEAMPLAY "0"
#define Q_DEFAULT_TIMELIMIT "0"
#define Q_DEFAULT_FRAGLIMIT "0"
/* Definitions for the QuakeWorld network protocol
*/
#define QW_DEFAULT_PORT 27500
#define QW_MASTER_DEFAULT_PORT 27000
#define QW_GET_SERVERS 'c'
#define QW_SERVERS 'd'
#define QW_GET_USERINFO 'o'
#define QW_USERINFO 'p'
#define QW_GET_SEENINFO 'u'
#define QW_SEENINFO 'v'
#define QW_NACK 'm'
#define QW_NEWLINE '\n'
#define QW_RULE_SEPARATOR '\\'
#define QW_REQUEST_LENGTH 20
#define QW_REQUEST_PREFIX '\377', '\377', '\377', '\377'
/* Output and formatting functions
*/
void display_server( struct qserver *server);
void display_qwmaster( struct qserver *server);
void display_server_rules( struct qserver *server);
void display_player_info( struct qserver *server);
void display_q_player_info( struct qserver *server);
void display_qw_player_info( struct qserver *server);
void display_q2_player_info( struct qserver *server);
void raw_display_server( struct qserver *server);
void raw_display_server_rules( struct qserver *server);
void raw_display_player_info( struct qserver *server);
void raw_display_q_player_info( struct qserver *server);
void raw_display_qw_player_info( struct qserver *server);
void raw_display_qw_seen_info( struct qserver *server, char *seen);
void raw_display_qw_user_info( struct qserver *server, struct qw_user *user);
void raw_display_q2_player_info( struct qserver *server);
int is_default_rule( struct rule *rule);
char *escape(unsigned char*);
char *quake_color( int color);
char *play_time( int seconds, int show_seconds);
char *ping_time( int ms);
char *get_qw_game( struct qserver *server);
/* Query status and packet handling functions
*/
void cleanup_qserver( struct qserver *server, int force);
void deal_with_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_q_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_qw_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_q1qw_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_q2_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_qwmaster_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_qw_userinfo_packet( struct qserver *server, char *pkt, int pktlen);
void deal_with_qw_seeninfo_packet( struct qserver *server, char *pkt, int pktlen);
int server_info_packet( struct qserver *server, struct qpacket *pkt,
int datalen);
int player_info_packet( struct qserver *server, struct qpacket *pkt,
int datalen);
int rule_info_packet( struct qserver *server, struct qpacket *pkt, int datalen);
int time_delta( struct timeval *later, struct timeval *past);
char * strherror( int h_err);
int connection_refused();
void add_file( char *filename);
int add_qserver( char *arg, int type);
int add_qserver_byaddr( unsigned long ipaddr, unsigned short port, int type);
void init_qserver( struct qserver *server);
int bind_qserver( struct qserver *server);
void bind_sockets();
void send_packets();
int send_server_request_packet( struct qserver *server);
int send_qserver_request_packet( struct qserver *server);
int send_qwmaster_request_packet( struct qserver *server);
int send_player_request_packet( struct qserver *server);
int send_rule_request_packet( struct qserver *server);
int send_qwuser_request_packet( struct qserver *server);
int send_qwseen_request_packet( struct qserver *server);
void next_qw_user( struct qserver *server);
void next_qw_seen( struct qserver *server);
int set_fds( fd_set *fds);
void get_next_timeout( struct timeval *timeout);
void print_packet( char *buf, int buflen);
|