diff --git a/code/gamespy/q_gamespy.c b/code/gamespy/q_gamespy.c index b4d88baf..4efff121 100644 --- a/code/gamespy/q_gamespy.c +++ b/code/gamespy/q_gamespy.c @@ -23,10 +23,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #pragma once #include "q_gamespy.h" -#include "../qcommon/q_shared.h" #include "../qcommon/qcommon.h" +#include "cl_gamespy.h" +#include "sv_gamespy.h" -#define MAX_MASTERS 8 +#define MAX_MASTERS 8 #define MASTER_DEFAULT_MSPORT 28900 #define MASTER_DEFAULT_HBPORT 27900 @@ -35,21 +36,55 @@ cvar_t *com_master_msport[MAX_MASTERS]; cvar_t *com_master_hbport[MAX_MASTERS]; master_entry_t entries[MAX_MASTERS]; -int num_entries = 0; +int num_entries = 0; -static void CreateMasterVar(int index, const char *host, int msport, int hbport) { - com_master_host[index] = Cvar_Get(va("com_master%d_host", index), host, CVAR_INIT); - com_master_msport[index] = Cvar_Get(va("com_master%d_msport", index), va("%d", msport), CVAR_INIT); - com_master_hbport[index] = Cvar_Get(va("com_master%d_hbport", index), va("%d", hbport), CVAR_INIT); -} +static void Com_RestartGameSpy_f(void); -void Com_InitGameSpy() { +static qboolean ShouldRefreshMasters() +{ int i; + for (i = 0; i < MAX_MASTERS; i++) { + if (com_master_host[i] && com_master_host[i]->latchedString) { + return qtrue; + } + if (com_master_msport[i] && com_master_msport[i]->latchedString) { + return qtrue; + } + if (com_master_hbport[i] && com_master_hbport[i]->latchedString) { + return qtrue; + } + } + + return qfalse; +} + +static void CreateMasterVar(int index, const char *host, int msport, int hbport) +{ // - // These entries come from the 333networks community and use the same software + // These variables should be modified for testing purposes only. + // So prevent them to be saved in the configuration file. + // + com_master_host[index] = Cvar_Get(va("com_master%d_host", index), host, CVAR_LATCH | CVAR_TEMP); + com_master_msport[index] = Cvar_Get(va("com_master%d_msport", index), va("%d", msport), CVAR_LATCH | CVAR_TEMP); + com_master_hbport[index] = Cvar_Get(va("com_master%d_hbport", index), va("%d", hbport), CVAR_LATCH | CVAR_TEMP); + + com_master_host[index]->flags &= ~CVAR_ARCHIVE; + com_master_msport[index]->flags &= ~CVAR_ARCHIVE; + com_master_hbport[index]->flags &= ~CVAR_ARCHIVE; +} + +qboolean Com_RefreshGameSpyMasters() +{ + int i; + qboolean shouldRestart; + + shouldRestart = ShouldRefreshMasters(); + + // + // These masters come from the 333networks community and use the same software // that emulate the GameSpy protocol -- see https://333networks.com/ - // These masters are managed by different entities, they are independent and are syncing eachother. + // They are managed by different entities, are independent and sync with eachother. // CreateMasterVar(0, "master.333networks.com", MASTER_DEFAULT_MSPORT, MASTER_DEFAULT_HBPORT); CreateMasterVar(1, "master.errorist.eu", MASTER_DEFAULT_MSPORT, MASTER_DEFAULT_HBPORT); @@ -57,7 +92,7 @@ void Com_InitGameSpy() { CreateMasterVar(3, "master-au.unrealarchive.org", MASTER_DEFAULT_MSPORT, MASTER_DEFAULT_HBPORT); CreateMasterVar(4, "master.frag-net.com", MASTER_DEFAULT_MSPORT, MASTER_DEFAULT_HBPORT); - for(i = 5; i < MAX_MASTERS; i++) { + for (i = 5; i < MAX_MASTERS; i++) { CreateMasterVar(i, "", MASTER_DEFAULT_MSPORT, MASTER_DEFAULT_HBPORT); } @@ -66,16 +101,35 @@ void Com_InitGameSpy() { // // Find and insert valid entries // - for(i = 0; i < MAX_MASTER_SERVERS; i++) { + for (i = 0; i < MAX_MASTER_SERVERS; i++) { master_entry_t *entry = &entries[num_entries]; if (com_master_host[i]->string && com_master_host[i]->string[0]) { - entry->host = com_master_host[i]->string; + entry->host = com_master_host[i]->string; entry->queryport = com_master_msport[i]->integer; - entry->hbport = com_master_hbport[i]->integer; + entry->hbport = com_master_hbport[i]->integer; num_entries++; } } + + return shouldRestart; +} + +void Com_InitGameSpy() +{ + Com_RefreshGameSpyMasters(); + + Cmd_AddCommand("net_gamespy_restart", Com_RestartGameSpy_f); +} + +static void Com_RestartGameSpy_f(void) +{ + Com_RefreshGameSpyMasters(); + +#ifndef DEDICATED + CL_RestartGamespy_f(); +#endif + SV_RestartGamespy_f(); } unsigned int Com_GetNumMasterEntries() @@ -83,18 +137,18 @@ unsigned int Com_GetNumMasterEntries() return num_entries; } -void Com_GetMasterEntry(int index, master_entry_t* entry) +void Com_GetMasterEntry(int index, master_entry_t *entry) { if (index >= num_entries) { - entry->host = NULL; - entry->hbport = 0; + entry->host = NULL; + entry->hbport = 0; entry->queryport = 0; return; } - entry->host = com_master_host[index]->string; + entry->host = com_master_host[index]->string; entry->queryport = com_master_msport[index]->integer; - entry->hbport = com_master_hbport[index]->integer; + entry->hbport = com_master_hbport[index]->integer; } const char *Com_GetMasterHost() diff --git a/code/gamespy/q_gamespy.h b/code/gamespy/q_gamespy.h index fe61fb58..a60baa3e 100644 --- a/code/gamespy/q_gamespy.h +++ b/code/gamespy/q_gamespy.h @@ -24,6 +24,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #pragma once +#include "../qcommon/q_shared.h" + typedef struct { const char *host; int queryport; @@ -31,6 +33,7 @@ typedef struct { } master_entry_t; void Com_InitGameSpy(); +qboolean Com_RefreshGameSpyMasters(); unsigned int Com_GetNumMasterEntries(); void Com_GetMasterEntry(int index, master_entry_t* entry);