1 /* XQF - Quake server browser and launcher 2 * Copyright (C) 1998-2000 Roman Pozlevich <roma@botik.ru> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 17 */ 18 19 #ifndef __XQF_H__ 20 #define __XQF_H__ 21 22 #include "gnuconfig.h" /* GNU autoconf */ 23 24 #include <sys/types.h> 25 #include <netinet/in.h> /* struct in_addr */ 26 #include <arpa/inet.h> /* struct in_addr */ 27 #include <time.h> /* time_t */ 28 29 #include <gtk/gtk.h> 30 #include <glib.h> 31 32 #define RC_DIR ".qf" /* legacy config dir, before 1.0.6 */ 33 #define XDG_RC_DIR "xqf" /* new config dir, since 1.0.6 */ 34 #define RC_FILE "qfrc" 35 #define CONFIG_FILE "config" 36 #define SERVERS_FILE "servers" 37 #define PLAYERS_FILE "players" 38 #define HOSTCACHE_FILE "hostcache" 39 #define EXEC_CFG "frontend.cfg" 40 #define PASSWORD_CFG "__passwd.cfg" 41 #define LAUNCHINFO_FILE "LaunchInfo.txt" 42 43 #define MAX_PING 9999 44 #define MAX_RETRIES 10 45 46 #define Q1_DEFAULT_PORT 26000 /* Quake */ 47 #define QW_DEFAULT_PORT 27500 /* QuakeWorld */ 48 #define Q2_DEFAULT_PORT 27910 /* Quake2 */ 49 #define Q3_DEFAULT_PORT 27960 /* Quake3 Arena */ 50 #define WO_DEFAULT_PORT 27960 /* Wolfenstein */ 51 #define EF_DEFAULT_PORT 27960 /* Voyager Elite Force */ 52 #define H2_DEFAULT_PORT 26900 /* Hexen2 */ 53 #define HW_DEFAULT_PORT 26950 /* HexenWorld */ 54 #define SN_DEFAULT_PORT 22450 /* Sin */ 55 #define HL_DEFAULT_PORT 27015 /* Half-Life */ 56 #define KP_DEFAULT_PORT 31510 /* Kingpin */ 57 #define SFS_DEFAULT_PORT 28910 /* Soldier of Fortune */ 58 #define SOF2S_DEFAULT_PORT 20100 /* Soldier of Fortune 2 */ 59 #define T2_DEFAULT_PORT 28000 /* Tribes 2 */ 60 #define HR_DEFAULT_PORT 28910 /* Heretic2 */ 61 #define UN_DEFAULT_PORT 7777 /* Unreal */ 62 #define AAO_DEFAULT_PORT 1716 /* AAO */ 63 #define UT2_DEFAULT_PORT 7777 /* Unreal Tournament 2003 */ 64 #define GPS_DEFAULT_PORT 27888 /* Gamespy Generic */ 65 #define DESCENT3_DEFAULT_PORT 2092 /* Descent 3 */ 66 67 #define QWM_DEFAULT_PORT 27000 /* QuakeWorld */ 68 #define Q2M_DEFAULT_PORT 27900 /* Quake2 master */ 69 #define Q3M_DEFAULT_PORT 27950 /* Quake3 master */ 70 #define WOM_DEFAULT_PORT 27950 /* Wolfenstein master */ 71 #define HLM_DEFAULT_PORT 27010 /* Half-Life master */ 72 #define D3M_DEFAULT_PORT 3445 /* Descent 3 master */ 73 #define EFM_DEFAULT_PORT 27953 /* Elite Force master */ 74 #define T2M_DEFAULT_PORT 28000 /* Tribes 2 */ 75 #define SOF2M_DEFAULT_PORT 20110 /* Soldier of Fortune 2 */ 76 77 /* max 0x8000, server->flags is unsigned */ 78 enum server_flags { 79 PLAYER_GROUP_RED = 0x001, 80 PLAYER_GROUP_GREEN = 0x002, 81 PLAYER_GROUP_BLUE = 0x004, 82 PLAYER_GROUP_MASK = 0x007, 83 84 SERVER_CHEATS = 0x008, 85 SERVER_PASSWORD = 0x010, 86 SERVER_SP_PASSWORD = 0x020, 87 SERVER_SPECTATE = 0x040, 88 SERVER_PUNKBUSTER = 0x080, 89 SERVER_INCOMPATIBLE = 0x100 90 }; 91 92 enum launch_mode { 93 LAUNCH_NORMAL, 94 LAUNCH_SPECTATE, 95 LAUNCH_RECORD 96 }; 97 98 99 // note: there is a limit of 256 servers, see get_server_pixmap in srv-list.c 100 enum server_type { 101 Q1_SERVER = 0, 102 QW_SERVER, 103 Q2_SERVER, 104 Q3_SERVER, 105 Q4_SERVER, 106 WO_SERVER, 107 WOET_SERVER, 108 ETL_SERVER, 109 DOOM3_SERVER, 110 ETQW_SERVER, 111 EF_SERVER, 112 H2_SERVER, 113 HW_SERVER, 114 SN_SERVER, 115 HL_SERVER_OLD, 116 HL_SERVER, 117 HL2_SERVER, 118 KP_SERVER, 119 SFS_SERVER, 120 SOF2S_SERVER, 121 T2_SERVER, 122 HR_SERVER, 123 UN_SERVER, 124 UT2_SERVER, 125 UT2004_SERVER, 126 RUNE_SERVER, 127 POSTAL2_SERVER, 128 AAO_SERVER, 129 DESCENT3_SERVER, 130 SSAM_SERVER, 131 SSAMSE_SERVER, 132 MOHAA_SERVER, 133 COD_SERVER, 134 SAS_SERVER, 135 BF1942_SERVER, 136 JK2_SERVER, 137 JK3_SERVER, 138 NETP_SERVER, 139 NEXUIZ_SERVER, 140 XONOTIC_SERVER, 141 WARSOW_SERVER, 142 TREMULOUS_SERVER, 143 TREMULOUSGPP_SERVER, 144 TREMFUSION_SERVER, 145 UNVANQUISHED_SERVER, 146 OPENARENA_SERVER, 147 OTTD_SERVER, 148 Q3RALLY_SERVER, 149 WOP_SERVER, 150 IOURT_SERVER, 151 REACTION_SERVER, 152 SMOKINGUNS_SERVER, 153 ZEQ2LITE_SERVER, 154 TURTLEARENA_SERVER, 155 ALIENARENA_SERVER, 156 GPS_SERVER, 157 UNKNOWN_SERVER 158 }; 159 160 #define GAMES_TOTAL UNKNOWN_SERVER 161 162 enum master_state { 163 SOURCE_NA = 0, 164 SOURCE_UP, 165 SOURCE_DOWN, 166 SOURCE_TIMEOUT, 167 SOURCE_ERROR 168 }; 169 170 enum master_query_type { 171 MASTER_NATIVE=0, 172 MASTER_GAMESPY, 173 MASTER_HTTP, 174 MASTER_LAN, 175 MASTER_FILE, 176 MASTER_GSLIST, 177 MASTER_NUM_QUERY_TYPES, 178 MASTER_INVALID_TYPE 179 }; 180 181 182 /** 183 * A player. There is no destructor for this struct. Alloc as many data as you 184 * need at once and have the pointers point inside. 185 */ 186 struct player { 187 char *name; 188 char *skin; 189 char *model; 190 int time; 191 short frags; 192 short ping; 193 unsigned char shirt; 194 unsigned char pants; 195 unsigned char flags; 196 }; 197 198 struct host { 199 char *name; 200 struct in_addr ip; 201 time_t refreshed; 202 int ref_count; 203 }; 204 205 206 /** server_new, server_free_info, server_move_info must be adapted for 207 * changes to this structure 208 */ 209 struct server { 210 struct host *host; 211 212 gchar *name; 213 char *map; 214 char **info; 215 char *game; /** pointer into info, do not free */ 216 char *gametype; /** pointer into info, do not free */ 217 GSList *players; /** GSList<struct player *> */ 218 219 #ifdef USE_GEOIP 220 int country_id; 221 #endif 222 223 unsigned flags; 224 225 unsigned flt_last; /** time of the last filtering */ 226 227 time_t refreshed; 228 time_t last_answer; /** time of last reply from server */ 229 230 int ref_count; 231 232 enum server_type type; 233 unsigned short port; 234 235 unsigned short maxplayers; 236 unsigned short curplayers; 237 unsigned short curbots; 238 unsigned short private_client; /** number of private clients */ 239 short ping; 240 short retries; 241 242 char sv_os; /** L = Linux, W = windows, M = Mac */ 243 244 unsigned char filters; 245 unsigned char flt_mask; 246 }; 247 248 struct userver { 249 char *hostname; 250 struct server *s; 251 int ref_count; 252 unsigned short port; 253 unsigned char type; /* enum server_type type; */ 254 }; 255 256 typedef struct { 257 int portadjust; /* value added to port */ 258 char* gsmtype; /* type for gslist master */ 259 } QFMasterOptions; 260 261 typedef struct master { 262 char *name; 263 enum server_type type; 264 int isgroup; /* is it a real master or master group? */ 265 int user; /* is it added or edited by user? */ 266 QFMasterOptions options; 267 268 struct host *host; 269 unsigned short port; 270 char *hostname; /* unresolved hostname */ 271 272 char *url; 273 274 GSList *servers; 275 GSList *uservers; 276 enum master_state state; 277 278 GSList *masters; 279 280 enum master_query_type master_type; 281 282 /** private */ 283 char* _qstat_master_option; // optional override from games[type].qstat_master_option 284 } QFMaster; 285 286 char* master_qstat_option(struct master* m); 287 void master_set_qstat_option(struct master* m, const char* opt); 288 289 char* master_to_url(QFMaster* m); 290 291 extern time_t xqf_start_time; 292 extern char* xqf_PACKAGE_DATA_DIR; 293 extern char* xqf_LOCALEDIR; 294 extern char* xqf_PIXMAPSDIR; 295 296 extern char* qstat_configfile; 297 298 extern GSList *cur_source; /* GSList <struct master *> */ 299 extern GSList *cur_server_list; /* GSList <struct server *> */ 300 extern GSList *cur_userver_list; /* GSList <struct server *> */ 301 302 extern struct server *cur_server; 303 304 extern struct stat_job *stat_process; 305 306 307 int compare_qstat_version (const char* have, const char* expected); 308 int start_prog_and_return_fd(char *const argv[], pid_t *pid); 309 int check_qstat_version(void); 310 311 void play_sound (const char *sound, gboolean override); 312 void play_sound_with (const char* player, const char *sound, gboolean override); 313 314 extern void reset_main_status_bar(void); 315 316 //extern int filter_start_index; 317 318 extern int event_type; 319 320 extern int dontlaunch; 321 322 extern void refresh_source_list (void); 323 extern void update_source_callback (GtkWidget *widget, gpointer data); 324 extern void refresh_n_server(GtkWidget * button, gpointer *data); 325 extern void stop_callback (GtkWidget *widget, gpointer data); 326 327 #endif /* __XQF_H__ */ 328