Callback:
float m_gethostcachecategory(float entry_id) {
// Is supposed to use gethostcachestring() etc. and return a
// category integer.
// The server list is sorted by this category first if
// SLSF_CATEGORIES is set in the sort flags.
}
From: Samual Lenks <samual@xonotic.org>
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@12021
d7cf8633-e32d-0410-b094-
e92efae38249
::stable-branch::merge=
d93b11b3f40d1ca94ed20e70c7a2fcf95670df73
if(var->integer <= 0)
Cvar_Set("rcon_password", "");
}
if(var->integer <= 0)
Cvar_Set("rcon_password", "");
}
else if (!strcmp(var->name, "net_slist_favorites"))
NetConn_UpdateFavorites();
else if (!strcmp(var->name, "net_slist_favorites"))
NetConn_UpdateFavorites();
}
Cvar_UpdateAutoCvar(var);
}
Cvar_UpdateAutoCvar(var);
void() m_draw;
void(float mode) m_toggle;
void() m_shutdown;
void() m_draw;
void(float mode) m_toggle;
void() m_shutdown;
+// optional: float(float) m_gethostcachecategory;
/////////////////////////////////////////////////////////
// sys constants
/////////////////////////////////////////////////////////
// sys constants
void sethostcachemaskstring(float mask, float fld, string str, float op) = #616;
void sethostcachemasknumber(float mask, float fld, float num, float op) = #617;
void resorthostcache(void) = #618;
void sethostcachemaskstring(float mask, float fld, string str, float op) = #616;
void sethostcachemasknumber(float mask, float fld, float num, float op) = #617;
void resorthostcache(void) = #618;
-void sethostcachesort(float fld, float descending) = #619;
+float SLSF_DESCENDING = 1;
+float SLSF_FAVORITES = 2;
+float SLSF_CATEGORIES = 4;
+void sethostcachesort(float fld, float slsf) = #619;
void refreshhostcache(...) = #620; // optional boolean argument "clear_list"
float gethostcachenumber(float fld, float hostnr) = #621;
float gethostcacheindexforkey(string key) = #622;
void refreshhostcache(...) = #620; // optional boolean argument "clear_list"
float gethostcachenumber(float fld, float hostnr) = #621;
float gethostcacheindexforkey(string key) = #622;
+static int M_GetServerListEntryCategory(const serverlist_entry_t *entry)
+{
+ return 0;
+}
+
void M_Shutdown(void)
{
// reset key_dest
void M_Shutdown(void)
{
// reset key_dest
prog->ExecuteProgram(prog, PRVM_menufunction(m_newmap),"m_newmap() required");
}
prog->ExecuteProgram(prog, PRVM_menufunction(m_newmap),"m_newmap() required");
}
+const serverlist_entry_t *serverlist_callbackentry = NULL;
+static int MP_GetServerListEntryCategory(const serverlist_entry_t *entry)
+{
+ prvm_prog_t *prog = MVM_prog;
+ serverlist_callbackentry = entry;
+ if (PRVM_menufunction(m_gethostcachecategory))
+ {
+ prog->globals.fp[OFS_PARM0] = (prvm_vec_t) -1;
+ prog->ExecuteProgram(prog, PRVM_menufunction(m_gethostcachecategory),"m_gethostcachecategory(float entry) required");
+ serverlist_callbackentry = NULL;
+ return prog->globals.fp[OFS_RETURN];
+ }
+ else
+ {
+ return 0;
+ }
+}
+
static void MP_Shutdown (void)
{
prvm_prog_t *prog = MVM_prog;
static void MP_Shutdown (void)
{
prvm_prog_t *prog = MVM_prog;
void (*MR_ToggleMenu) (int mode);
void (*MR_Shutdown) (void);
void (*MR_NewMap) (void);
void (*MR_ToggleMenu) (int mode);
void (*MR_Shutdown) (void);
void (*MR_NewMap) (void);
+int (*MR_GetServerListEntryCategory) (const serverlist_entry_t *entry);
void MR_SetRouting(qboolean forceold)
{
void MR_SetRouting(qboolean forceold)
{
MR_ToggleMenu = M_ToggleMenu;
MR_Shutdown = M_Shutdown;
MR_NewMap = M_NewMap;
MR_ToggleMenu = M_ToggleMenu;
MR_Shutdown = M_Shutdown;
MR_NewMap = M_NewMap;
+ MR_GetServerListEntryCategory = M_GetServerListEntryCategory;
MR_ToggleMenu = MP_ToggleMenu;
MR_Shutdown = MP_Shutdown;
MR_NewMap = MP_NewMap;
MR_ToggleMenu = MP_ToggleMenu;
MR_Shutdown = MP_Shutdown;
MR_NewMap = MP_NewMap;
+ MR_GetServerListEntryCategory = MP_GetServerListEntryCategory;
extern void (*MR_ToggleMenu) (int mode);
extern void (*MR_Shutdown) (void);
extern void (*MR_NewMap) (void);
extern void (*MR_ToggleMenu) (int mode);
extern void (*MR_Shutdown) (void);
extern void (*MR_NewMap) (void);
+extern int (*MR_GetServerListEntryCategory) (const serverlist_entry_t *entry);
typedef struct video_resolution_s
{
typedef struct video_resolution_s
{
case SLIF_FREESLOTS:
mask->info.freeslots = number;
break;
case SLIF_FREESLOTS:
mask->info.freeslots = number;
break;
+ case SLIF_CATEGORY:
+ mask->info.category = number;
+ break;
case SLIF_ISFAVORITE:
mask->info.isfavorite = number != 0;
break;
case SLIF_ISFAVORITE:
mask->info.isfavorite = number != 0;
break;
*/
static void VM_M_getserverliststring(prvm_prog_t *prog)
{
*/
static void VM_M_getserverliststring(prvm_prog_t *prog)
{
- serverlist_entry_t *cache;
+ const serverlist_entry_t *cache;
int hostnr;
VM_SAFEPARMCOUNT(2, VM_M_getserverliststring);
int hostnr;
VM_SAFEPARMCOUNT(2, VM_M_getserverliststring);
hostnr = (int)PRVM_G_FLOAT(OFS_PARM1);
hostnr = (int)PRVM_G_FLOAT(OFS_PARM1);
- if(hostnr < 0 || hostnr >= serverlist_viewcount)
+ if(hostnr == -1 && serverlist_callbackentry)
- Con_Print("VM_M_getserverliststring: bad hostnr passed!\n");
- return;
+ cache = serverlist_callbackentry;
+ }
+ else
+ {
+ if(hostnr < 0 || hostnr >= serverlist_viewcount)
+ {
+ Con_Print("VM_M_getserverliststring: bad hostnr passed!\n");
+ return;
+ }
+ cache = ServerList_GetViewEntry(hostnr);
- cache = ServerList_GetViewEntry(hostnr);
switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) {
case SLIF_CNAME:
PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.cname );
switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) {
case SLIF_CNAME:
PRVM_G_INT( OFS_RETURN ) = PRVM_SetTempString( prog, cache->info.cname );
*/
static void VM_M_getserverlistnumber(prvm_prog_t *prog)
{
*/
static void VM_M_getserverlistnumber(prvm_prog_t *prog)
{
- serverlist_entry_t *cache;
+ const serverlist_entry_t *cache;
int hostnr;
VM_SAFEPARMCOUNT(2, VM_M_getserverliststring);
int hostnr;
VM_SAFEPARMCOUNT(2, VM_M_getserverliststring);
hostnr = (int)PRVM_G_FLOAT(OFS_PARM1);
hostnr = (int)PRVM_G_FLOAT(OFS_PARM1);
- if(hostnr < 0 || hostnr >= serverlist_viewcount)
+ if(hostnr == -1 && serverlist_callbackentry)
- Con_Print("VM_M_getserverliststring: bad hostnr passed!\n");
- return;
+ cache = serverlist_callbackentry;
+ }
+ else
+ {
+ if(hostnr < 0 || hostnr >= serverlist_viewcount)
+ {
+ Con_Print("VM_M_getserverliststring: bad hostnr passed!\n");
+ return;
+ }
+ cache = ServerList_GetViewEntry(hostnr);
- cache = ServerList_GetViewEntry(hostnr);
switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) {
case SLIF_MAXPLAYERS:
PRVM_G_FLOAT( OFS_RETURN ) = cache->info.maxplayers;
switch( (int) PRVM_G_FLOAT(OFS_PARM0) ) {
case SLIF_MAXPLAYERS:
PRVM_G_FLOAT( OFS_RETURN ) = cache->info.maxplayers;
case SLIF_PROTOCOL:
PRVM_G_FLOAT( OFS_RETURN ) = cache->info.protocol;
break;
case SLIF_PROTOCOL:
PRVM_G_FLOAT( OFS_RETURN ) = cache->info.protocol;
break;
+ case SLIF_CATEGORY:
+ PRVM_G_FLOAT( OFS_RETURN ) = cache->info.category;
+ break;
case SLIF_ISFAVORITE:
PRVM_G_FLOAT( OFS_RETURN ) = cache->info.isfavorite;
break;
case SLIF_ISFAVORITE:
PRVM_G_FLOAT( OFS_RETURN ) = cache->info.isfavorite;
break;
PRVM_G_FLOAT( OFS_RETURN ) = SLIF_FREESLOTS;
else if( !strcmp( key, "protocol" ) )
PRVM_G_FLOAT( OFS_RETURN ) = SLIF_PROTOCOL;
PRVM_G_FLOAT( OFS_RETURN ) = SLIF_FREESLOTS;
else if( !strcmp( key, "protocol" ) )
PRVM_G_FLOAT( OFS_RETURN ) = SLIF_PROTOCOL;
+ else if( !strcmp( key, "category" ) )
+ PRVM_G_FLOAT( OFS_RETURN ) = SLIF_CATEGORY;
else if( !strcmp( key, "isfavorite" ) )
PRVM_G_FLOAT( OFS_RETURN ) = SLIF_ISFAVORITE;
else
else if( !strcmp( key, "isfavorite" ) )
PRVM_G_FLOAT( OFS_RETURN ) = SLIF_ISFAVORITE;
else
static cvar_t sv_qwmasters [] =
{
{CVAR_SAVE, "sv_qwmaster1", "", "user-chosen qwmaster server 1"},
static cvar_t sv_qwmasters [] =
{
{CVAR_SAVE, "sv_qwmaster1", "", "user-chosen qwmaster server 1"},
{0, "sv_qwmasterextra5", "qwmaster.fodquake.net:27000", "Global master server. (admin: unknown)"},
{0, NULL, NULL, NULL}
};
{0, "sv_qwmasterextra5", "qwmaster.fodquake.net:27000", "Global master server. (admin: unknown)"},
{0, NULL, NULL, NULL}
};
static double nextheartbeattime = 0;
static double nextheartbeattime = 0;
challenge_t challenge[MAX_CHALLENGES];
challenge_t challenge[MAX_CHALLENGES];
/// this is only false if there are still servers left to query
static qboolean serverlist_querysleep = true;
static qboolean serverlist_paused = false;
/// this is only false if there are still servers left to query
static qboolean serverlist_querysleep = true;
static qboolean serverlist_paused = false;
/// reply is received, to avoid issuing queries while master replies are still
/// flooding in (which would make a mess of the ping times)
static double serverlist_querywaittime = 0;
/// reply is received, to avoid issuing queries while master replies are still
/// flooding in (which would make a mess of the ping times)
static double serverlist_querywaittime = 0;
static int cl_numsockets;
static lhnetsocket_t *cl_sockets[16];
static int cl_numsockets;
static lhnetsocket_t *cl_sockets[16];
int sv_net_extresponse_count = 0;
int sv_net_extresponse_last = 0;
int sv_net_extresponse_count = 0;
int sv_net_extresponse_last = 0;
// ServerList interface
serverlist_mask_t serverlist_andmasks[SERVERLIST_ANDMASKCOUNT];
serverlist_mask_t serverlist_ormasks[SERVERLIST_ORMASKCOUNT];
// ServerList interface
serverlist_mask_t serverlist_andmasks[SERVERLIST_ANDMASKCOUNT];
serverlist_mask_t serverlist_ormasks[SERVERLIST_ORMASKCOUNT];
{
int result = 0; // > 0 if for numbers A > B and for text if A < B
{
int result = 0; // > 0 if for numbers A > B and for text if A < B
- if( serverlist_sortflags & SLSF_FAVORITESFIRST )
+ if( serverlist_sortflags & SLSF_CATEGORIES )
+ {
+ result = A->info.category - B->info.category;
+ if (result != 0)
+ return result < 0;
+ }
+
+ if( serverlist_sortflags & SLSF_FAVORITES )
{
if(A->info.isfavorite != B->info.isfavorite)
return A->info.isfavorite;
}
{
if(A->info.isfavorite != B->info.isfavorite)
return A->info.isfavorite;
}
switch( serverlist_sortbyfield ) {
case SLIF_PING:
result = A->info.ping - B->info.ping;
switch( serverlist_sortbyfield ) {
case SLIF_PING:
result = A->info.ping - B->info.ping;
case SLIF_QCSTATUS:
result = strcasecmp( B->info.qcstatus, A->info.qcstatus ); // not really THAT useful, though
break;
case SLIF_QCSTATUS:
result = strcasecmp( B->info.qcstatus, A->info.qcstatus ); // not really THAT useful, though
break;
+ case SLIF_CATEGORY:
+ result = A->info.category - B->info.category;
+ break;
case SLIF_ISFAVORITE:
result = !!B->info.isfavorite - !!A->info.isfavorite;
break;
case SLIF_ISFAVORITE:
result = !!B->info.isfavorite - !!A->info.isfavorite;
break;
if( *mask->info.players
&& !_ServerList_CompareStr( info->players, mask->tests[SLIF_PLAYERS], mask->info.players ) )
return false;
if( *mask->info.players
&& !_ServerList_CompareStr( info->players, mask->tests[SLIF_PLAYERS], mask->info.players ) )
return false;
+ if( !_ServerList_CompareInt( info->category, mask->tests[SLIF_CATEGORY], mask->info.category ) )
+ return false;
if( !_ServerList_CompareInt( info->isfavorite, mask->tests[SLIF_ISFAVORITE], mask->info.isfavorite ))
return false;
return true;
if( !_ServerList_CompareInt( info->isfavorite, mask->tests[SLIF_ISFAVORITE], mask->info.isfavorite ))
return false;
return true;
+ // refresh the "category"
+ entry->info.category = MR_GetServerListEntryCategory(entry);
+
// FIXME: change this to be more readable (...)
// now check whether it passes through the masks
for( start = 0 ; start < SERVERLIST_ANDMASKCOUNT && serverlist_andmasks[start].active; start++ )
// FIXME: change this to be more readable (...)
// now check whether it passes through the masks
for( start = 0 ; start < SERVERLIST_ANDMASKCOUNT && serverlist_andmasks[start].active; start++ )
NetConn_QueryMasters(querydp, queryqw);
}
NetConn_QueryMasters(querydp, queryqw);
}
static int NetConn_ClientParsePacket_ServerList_ProcessReply(const char *addressstring)
{
int n;
static int NetConn_ClientParsePacket_ServerList_ProcessReply(const char *addressstring)
{
int n;
serverlist_querysleep = false;
serverlist_querywaittime = realtime + 3;
}
serverlist_querysleep = false;
serverlist_querywaittime = realtime + 3;
}
static int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, unsigned char *data, int length, lhnetaddress_t *peeraddress)
{
qboolean fromserver;
int ret, c;
static int NetConn_ClientParsePacket(lhnetsocket_t *mysocket, unsigned char *data, int length, lhnetaddress_t *peeraddress)
{
qboolean fromserver;
int ret, c;
- const char *s;
- char *string, addressstring2[128], ipstring[32];
+ char *string, addressstring2[128];
char stringbuf[16384];
char senddata[NET_HEADERSIZE+NET_MAXMESSAGE+CRYPTO_HEADERSIZE];
size_t sendlength;
char stringbuf[16384];
char senddata[NET_HEADERSIZE+NET_MAXMESSAGE+CRYPTO_HEADERSIZE];
size_t sendlength;
char infostringvalue[MAX_INPUTLINE];
char infostringvalue[MAX_INPUTLINE];
+ char ipstring[32];
+ const char *s;
+#endif
char vabuf[1024];
// quakeworld ingame packet
char vabuf[1024];
// quakeworld ingame packet
if (length >= 15 && !memcmp(string, "statusResponse\x0A", 15))
{
serverlist_info_t *info;
if (length >= 15 && !memcmp(string, "statusResponse\x0A", 15))
{
serverlist_info_t *info;
serverlist_querywaittime = realtime + 3;
return true;
}
serverlist_querywaittime = realtime + 3;
return true;
}
if (!strncmp(string, "extResponse ", 12))
{
++cl_net_extresponse_count;
if (!strncmp(string, "extResponse ", 12))
{
++cl_net_extresponse_count;
}
if (length > 2 && !memcmp(string, "n\\", 2))
{
}
if (length > 2 && !memcmp(string, "n\\", 2))
{
serverlist_info_t *info;
int n;
serverlist_info_t *info;
int n;
}
NetConn_ClientParsePacket_ServerList_UpdateCache(n);
}
NetConn_ClientParsePacket_ServerList_UpdateCache(n);
return true;
}
if (string[0] == 'n')
return true;
}
if (string[0] == 'n')
// netquake control packets, supported for compatibility only
if (length >= 5 && BuffBigLong(data) == ((int)NETFLAG_CTL | length) && !ENCRYPTION_REQUIRED)
{
// netquake control packets, supported for compatibility only
if (length >= 5 && BuffBigLong(data) == ((int)NETFLAG_CTL | length) && !ENCRYPTION_REQUIRED)
{
int n;
serverlist_info_t *info;
int n;
serverlist_info_t *info;
case CCREP_SERVER_INFO:
if (developer_extra.integer)
Con_DPrintf("Datagram_ParseConnectionless: received CCREP_SERVER_INFO from %s.\n", addressstring2);
case CCREP_SERVER_INFO:
if (developer_extra.integer)
Con_DPrintf("Datagram_ParseConnectionless: received CCREP_SERVER_INFO from %s.\n", addressstring2);
// LordHavoc: because the quake server may report weird addresses
// we just ignore it and keep the real address
MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring));
// LordHavoc: because the quake server may report weird addresses
// we just ignore it and keep the real address
MSG_ReadString(&cl_message, cl_readstring, sizeof(cl_readstring));
info->protocol = MSG_ReadByte(&cl_message);
NetConn_ClientParsePacket_ServerList_UpdateCache(n);
info->protocol = MSG_ReadByte(&cl_message);
NetConn_ClientParsePacket_ServerList_UpdateCache(n);
break;
case CCREP_RCON: // RocketGuy: ProQuake rcon support
if (developer_extra.integer)
break;
case CCREP_RCON: // RocketGuy: ProQuake rcon support
if (developer_extra.integer)
void NetConn_QueryQueueFrame(void)
{
int index;
void NetConn_QueryQueueFrame(void)
{
int index;
void NetConn_ClientFrame(void)
{
void NetConn_ClientFrame(void)
{
// R_TimeReport("clientparsepacket");
}
}
// R_TimeReport("clientparsepacket");
}
}
NetConn_QueryQueueFrame();
NetConn_QueryQueueFrame();
if (cls.netcon && realtime > cls.netcon->timeout && !sv.active)
{
Con_Print("Connection timed out\n");
if (cls.netcon && realtime > cls.netcon->timeout && !sv.active)
{
Con_Print("Connection timed out\n");
LHNET_SleepUntilPacket_Microseconds(microseconds);
}
LHNET_SleepUntilPacket_Microseconds(microseconds);
}
void NetConn_QueryMasters(qboolean querydp, qboolean queryqw)
{
int i, j;
void NetConn_QueryMasters(qboolean querydp, qboolean queryqw)
{
int i, j;
{
if (sv_qwmasters[masternum].string && LHNETADDRESS_FromString(&masteraddress, sv_qwmasters[masternum].string, QWMASTER_PORT) && LHNETADDRESS_GetAddressType(&masteraddress) == LHNETADDRESS_GetAddressType(LHNET_AddressFromSocket(cl_sockets[i])))
{
{
if (sv_qwmasters[masternum].string && LHNETADDRESS_FromString(&masteraddress, sv_qwmasters[masternum].string, QWMASTER_PORT) && LHNETADDRESS_GetAddressType(&masteraddress) == LHNETADDRESS_GetAddressType(LHNET_AddressFromSocket(cl_sockets[i])))
{
if (m_state != m_slist)
{
if (m_state != m_slist)
{
char lookupstring[128];
LHNETADDRESS_ToString(&masteraddress, lookupstring, sizeof(lookupstring), true);
Con_Printf("Querying master %s (resolved from %s)\n", lookupstring, sv_qwmasters[masternum].string);
char lookupstring[128];
LHNETADDRESS_ToString(&masteraddress, lookupstring, sizeof(lookupstring), true);
Con_Printf("Querying master %s (resolved from %s)\n", lookupstring, sv_qwmasters[masternum].string);
masterquerycount++;
NetConn_Write(cl_sockets[i], request, (int)strlen(request) + 1, &masteraddress);
}
masterquerycount++;
NetConn_Write(cl_sockets[i], request, (int)strlen(request) + 1, &masteraddress);
}
if (!masterquerycount)
{
Con_Print("Unable to query master servers, no suitable network sockets active.\n");
if (!masterquerycount)
{
Con_Print("Unable to query master servers, no suitable network sockets active.\n");
M_Update_Return_Reason("No network");
M_Update_Return_Reason("No network");
void NetConn_Heartbeat(int priority)
{
void NetConn_Heartbeat(int priority)
{
void Net_Refresh_f(void)
{
void Net_Refresh_f(void)
{
if (m_state != m_slist) {
if (m_state != m_slist) {
Con_Print("Sending new requests to master servers\n");
ServerList_QueryList(false, true, false, true);
Con_Print("Listening for replies...\n");
Con_Print("Sending new requests to master servers\n");
ServerList_QueryList(false, true, false, true);
Con_Print("Listening for replies...\n");
} else
ServerList_QueryList(false, true, false, false);
} else
ServerList_QueryList(false, true, false, false);
ServerList_ResetMasks();
serverlist_sortbyfield = SLIF_PING;
serverlist_sortflags = 0;
ServerList_ResetMasks();
serverlist_sortbyfield = SLIF_PING;
serverlist_sortflags = 0;
if (m_state != m_slist) {
if (m_state != m_slist) {
Con_Print("Sending requests to master servers\n");
ServerList_QueryList(true, true, false, true);
Con_Print("Listening for replies...\n");
Con_Print("Sending requests to master servers\n");
ServerList_QueryList(true, true, false, true);
Con_Print("Listening for replies...\n");
} else
ServerList_QueryList(true, true, false, false);
} else
ServerList_QueryList(true, true, false, false);
}
void Net_SlistQW_f(void)
}
void Net_SlistQW_f(void)
ServerList_ResetMasks();
serverlist_sortbyfield = SLIF_PING;
serverlist_sortflags = 0;
ServerList_ResetMasks();
serverlist_sortbyfield = SLIF_PING;
serverlist_sortflags = 0;
if (m_state != m_slist) {
if (m_state != m_slist) {
Con_Print("Sending requests to master servers\n");
ServerList_QueryList(true, false, true, true);
serverlist_consoleoutput = true;
Con_Print("Listening for replies...\n");
Con_Print("Sending requests to master servers\n");
ServerList_QueryList(true, false, true, true);
serverlist_consoleoutput = true;
Con_Print("Listening for replies...\n");
} else
ServerList_QueryList(true, false, true, false);
} else
ServerList_QueryList(true, false, true, false);
void NetConn_Init(void)
{
void NetConn_Init(void)
{
lhnetaddress_t tempaddress;
netconn_mempool = Mem_AllocPool("network connections", 0, NULL);
Cmd_AddCommand("net_stats", Net_Stats_f, "print network statistics");
lhnetaddress_t tempaddress;
netconn_mempool = Mem_AllocPool("network connections", 0, NULL);
Cmd_AddCommand("net_stats", Net_Stats_f, "print network statistics");
Cmd_AddCommand("net_slist", Net_Slist_f, "query dp master servers and print all server information");
Cmd_AddCommand("net_slistqw", Net_SlistQW_f, "query qw master servers and print all server information");
Cmd_AddCommand("net_refresh", Net_Refresh_f, "query dp master servers and refresh all server information");
Cmd_AddCommand("net_slist", Net_Slist_f, "query dp master servers and print all server information");
Cmd_AddCommand("net_slistqw", Net_SlistQW_f, "query qw master servers and print all server information");
Cmd_AddCommand("net_refresh", Net_Refresh_f, "query dp master servers and refresh all server information");
Cmd_AddCommand("heartbeat", Net_Heartbeat_f, "send a heartbeat to the master server (updates your server information)");
Cvar_RegisterVariable(&net_test);
Cvar_RegisterVariable(&net_usesizelimit);
Cmd_AddCommand("heartbeat", Net_Heartbeat_f, "send a heartbeat to the master server (updates your server information)");
Cvar_RegisterVariable(&net_test);
Cvar_RegisterVariable(&net_usesizelimit);
extern cvar_t hostname;
extern cvar_t developer_networking;
extern cvar_t hostname;
extern cvar_t developer_networking;
#define SERVERLIST_VIEWLISTSIZE SERVERLIST_TOTALSIZE
typedef enum serverlist_maskop_e
#define SERVERLIST_VIEWLISTSIZE SERVERLIST_TOTALSIZE
typedef enum serverlist_maskop_e
/// (an integer that is used for filtering incompatible servers,
/// not filterable by QC)
int gameversion;
/// (an integer that is used for filtering incompatible servers,
/// not filterable by QC)
int gameversion;
+
+ // categorized sorting
+ int category;
/// favorite server flag
qboolean isfavorite;
} serverlist_info_t;
/// favorite server flag
qboolean isfavorite;
} serverlist_info_t;
SLIF_FREESLOTS,
SLIF_QCSTATUS,
SLIF_PLAYERS,
SLIF_FREESLOTS,
SLIF_QCSTATUS,
SLIF_PLAYERS,
SLIF_ISFAVORITE,
SLIF_COUNT
} serverlist_infofield_t;
SLIF_ISFAVORITE,
SLIF_COUNT
} serverlist_infofield_t;
typedef enum
{
SLSF_DESCENDING = 1,
typedef enum
{
SLSF_DESCENDING = 1,
- SLSF_FAVORITESFIRST = 2
+ SLSF_FAVORITES = 2,
+ SLSF_CATEGORIES = 4
} serverlist_sortflags_t;
typedef enum
} serverlist_sortflags_t;
typedef enum
extern int serverlist_cachecount;
extern serverlist_entry_t *serverlist_cache;
extern int serverlist_cachecount;
extern serverlist_entry_t *serverlist_cache;
+extern const serverlist_entry_t *serverlist_callbackentry;
extern qboolean serverlist_consoleoutput;
void ServerList_GetPlayerStatistics(int *numplayerspointer, int *maxplayerspointer);
extern qboolean serverlist_consoleoutput;
void ServerList_GetPlayerStatistics(int *numplayerspointer, int *maxplayerspointer);
//============================================================================
//
//============================================================================
//
extern int sv_net_extresponse_count;
extern int sv_net_extresponse_last;
extern int sv_net_extresponse_count;
extern int sv_net_extresponse_last;
extern double masterquerytime;
extern int masterquerycount;
extern int masterreplycount;
extern int serverquerycount;
extern int serverreplycount;
extern double masterquerytime;
extern int masterquerycount;
extern int masterreplycount;
extern int serverquerycount;
extern int serverreplycount;
extern sizebuf_t cl_message;
extern sizebuf_t sv_message;
extern sizebuf_t cl_message;
extern sizebuf_t sv_message;
void NetConn_ClientFrame(void);
void NetConn_ServerFrame(void);
void NetConn_SleepMicroseconds(int microseconds);
void NetConn_ClientFrame(void);
void NetConn_ServerFrame(void);
void NetConn_SleepMicroseconds(int microseconds);
-void NetConn_QueryMasters(qboolean querydp, qboolean queryqw);
void NetConn_Heartbeat(int priority);
void NetConn_Heartbeat(int priority);
-void NetConn_QueryQueueFrame(void);
+
+#ifdef CONFIG_MENU
+void NetConn_QueryMasters(qboolean querydp, qboolean queryqw);
+void NetConn_QueryQueueFrame(void);
void Net_Slist_f(void);
void Net_SlistQW_f(void);
void Net_Refresh_f(void);
void Net_Slist_f(void);
void Net_SlistQW_f(void);
void Net_Refresh_f(void);
/// called whenever net_slist_favorites changes
void NetConn_UpdateFavorites(void);
/// called whenever net_slist_favorites changes
void NetConn_UpdateFavorites(void);
#define MAX_CHALLENGES 128
typedef struct challenge_s
#define MAX_CHALLENGES 128
typedef struct challenge_s
PRVM_DECLARE_function(m_keydown)
PRVM_DECLARE_function(m_keyup)
PRVM_DECLARE_function(m_newmap)
PRVM_DECLARE_function(m_keydown)
PRVM_DECLARE_function(m_keyup)
PRVM_DECLARE_function(m_newmap)
+PRVM_DECLARE_function(m_gethostcachecategory)
PRVM_DECLARE_function(m_shutdown)
PRVM_DECLARE_function(m_toggle)
PRVM_DECLARE_function(main)
PRVM_DECLARE_function(m_shutdown)
PRVM_DECLARE_function(m_toggle)
PRVM_DECLARE_function(main)