#define SS_FTESERVER 1 //hehehe... #define SS_QUAKE2 2 //useful (and cool). Could be blamed for swamping. #define SS_NETQUAKE 4 #define SS_FAVORITE 8 //filter all others. #define SS_KEEPINFO 16 //despite not supporting nq or q2, we still load them. We just filter them. This is to make sure we properly write the listing files. #define MT_BAD 0 //this would be an error #define MT_BCASTQW 1 //-1status #define MT_BCASTQ2 2 //-1status #define MT_BCASTNQ 3 //see code #define MT_SINGLEQW 4 //-1status #define MT_SINGLEQ2 5 //-1status #define MT_SINGLENQ 6 //see code. #define MT_MASTERQW 7 //c\n\0 #define MT_MASTERQ2 8 //query typedef enum{ SLKEY_PING, SLKEY_MAP, SLKEY_NAME, SLKEY_ADDRESS, SLKEY_NUMPLAYERS, SLKEY_MAXPLAYERS, SLKEY_GAMEDIR, SLKEY_TOOMANY, SLKEY_CUSTOM } hostcachekey_t; typedef enum { SLIST_TEST_CONTAINS, SLIST_TEST_NOTCONTAIN, SLIST_TEST_LESSEQUAL, SLIST_TEST_LESS, SLIST_TEST_EQUAL, SLIST_TEST_GREATER, SLIST_TEST_GREATEREQUAL, SLIST_TEST_NOTEQUAL } slist_test_t; //contains info about a server in greater detail. Could be too mem intensive. typedef struct serverdetailedinfo_s { char info[MAX_SERVERINFO_STRING]; int numplayers; struct { int userid; int frags; float time; int ping; char name[64]; char skin[64]; char topc; char botc; } players[MAX_CLIENTS]; } serverdetailedinfo_t; //hold minimum info. typedef struct serverinfo_s { char name[64]; //hostname. netadr_t adr; unsigned char players; unsigned char maxplayers; qbyte special; //flags qbyte sends; qbyte insortedlist; unsigned short ping; short tl; short fl; char gamedir[8+1]; char map[8+1]; float refreshtime; serverdetailedinfo_t *moreinfo; struct serverinfo_s *next; } serverinfo_t; typedef struct master_s{ struct master_s *next; netadr_t adr; int type; char name[1]; } master_t; struct { qboolean inuse; netadr_t adr; serverdetailedinfo_t *detail; int linenum; } selectedserver; typedef struct player_s { char name[16]; int frags; int colour; char skin[8]; netadr_t adr; struct player_s *next; } player_t; void SListOptionChanged(serverinfo_t *newserver); extern serverinfo_t *firstserver; extern master_t *master; extern player_t *mplayers; void CL_QueryServers(void); int NET_CheckPollSockets(void); void MasterInfo_Request(master_t *mast, qboolean evenifwedonthavethefiles); serverinfo_t *Master_InfoForServer (netadr_t addr); serverinfo_t *Master_InfoForNum (int num); int Master_TotalCount(void); void Master_QueryServer(serverinfo_t *server); void MasterInfo_WriteServers(void); int Master_KeyForName(char *keyname); float Master_ReadKeyFloat(serverinfo_t *server, int keynum); char *Master_ReadKeyString(serverinfo_t *server, int keynum); void Master_SetSortField(hostcachekey_t field, qboolean descending); hostcachekey_t Master_GetSortField(void); qboolean Master_GetSortDescending(void); int Master_NumSorted(void); void Master_ClearMasks(void); serverinfo_t *Master_SortedServer(int idx);