X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=net_main.c;h=6e05570210a33c80b8c900ad5dc91f62b2a2c636;hb=c369fcf631b61d72c598ae37b01fc89a318044ae;hp=4c6971d0599c72ba519e80583e8326ecbb7acefb;hpb=ea7c24e1fb41f3b1df984ac0eed6881c9fde16f5;p=xonotic%2Fdarkplaces.git diff --git a/net_main.c b/net_main.c index 4c6971d0..6e055702 100644 --- a/net_main.c +++ b/net_main.c @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // net_main.c #include "quakedef.h" +#include "net_master.h" qsocket_t *net_activeSockets = NULL; mempool_t *net_mempool; @@ -46,6 +47,11 @@ static void Slist_Poll(void); PollProcedure slistSendProcedure = {NULL, 0.0, Slist_Send}; PollProcedure slistPollProcedure = {NULL, 0.0, Slist_Poll}; +static void InetSlist_Send(void); +static void InetSlist_Poll(void); +PollProcedure inetSlistSendProcedure = {NULL, 0.0, InetSlist_Send}; +PollProcedure inetSlistPollProcedure = {NULL, 0.0, InetSlist_Poll}; + sizebuf_t net_message; int net_activeconnections = 0; @@ -66,6 +72,107 @@ qboolean configRestored = false; int net_driverlevel; +/* +#define SLSERVERS 1024 +#define SLNAME 40 +#define SLMAPNAME 16 +#define SLMODNAME 16 +typedef struct slserver_s +{ + unsigned int ipaddr; + unsigned short port; + unsigned short ping; + char name[SLNAME]; + char mapname[SLMAPNAME]; + char modname[SLMODNAME]; +} +slserver_t; + +slserver_t sl_server[SLSERVERS]; +int sl_numservers = 0; + +void SL_ClearServers(void) +{ + sl_numservers = 0; +} + +slserver_t *SL_FindServer(unsigned int ipaddr, unsigned short port) +{ + int i; + slserver_t *sl; + for (i = 0, sl = sl_server;i < sl_numservers;i++, sl++) + if (sl->ipaddr == ipaddr && sl->port == port) + return; +} + +void SL_AddServer(unsigned int ipaddr, unsigned short port) +{ + if (SL_FindServer(ipaddr, port)) + return; + memset(sl_server + sl_numservers, 0, sizeof(slserver_t)); + sl_server[sl_numservers].ipaddr = ipaddr; + sl_server[sl_numservers].port = port; + sl_server[sl_numservers].ping = 0xFFFF; + sl_numservers++; +} + +void SL_UpdateServerName(unsigned int ipaddr, unsigned short port, const char *name); +{ + int namelen; + slserver_t *sl; + sl = SL_FindServer(ipaddr, port); + if (sl == NULL) + return; + memset(sl->name, 0, sizeof(sl->name)); + namelen = strlen(name); + if (namelen > sizeof(sl->name) - 1) + namelen = sizeof(sl->name) - 1; + if (namelen) + memcpy(sl->name, name, namelen); +} + +void SL_UpdateServerModName(unsigned int ipaddr, unsigned short port, const char *name); +{ + int namelen; + slserver_t *sl; + sl = SL_FindServer(ipaddr, port); + if (sl == NULL) + return; + memset(sl->modname, 0, sizeof(sl->modname)); + namelen = strlen(name); + if (namelen > sizeof(sl->modname) - 1) + namelen = sizeof(sl->modname) - 1; + if (namelen) + memcpy(sl->modname, name, namelen); +} + +void SL_UpdateServerMapName(unsigned int ipaddr, unsigned short port, const char *name); +{ + int namelen; + slserver_t *sl; + sl = SL_FindServer(ipaddr, port); + if (sl == NULL) + return; + memset(sl->mapname, 0, sizeof(sl->mapname)); + namelen = strlen(name); + if (namelen > sizeof(sl->mapname) - 1) + namelen = sizeof(sl->mapname) - 1; + if (namelen) + memcpy(sl->mapname, name, namelen); +} + +void SL_UpdateServerPing(unsigned int ipaddr, unsigned short port, float ping); +{ + int i; + slserver_t *sl; + sl = SL_FindServer(ipaddr, port); + if (sl == NULL) + return; + i = ping * 1000.0; + sl->ping = bound(0, i, 9999); +} +*/ + double net_time; @@ -162,7 +269,7 @@ static void NET_Listen_f (void) static void MaxPlayers_f (void) { - int n; + int n; if (Cmd_Argc () != 2) { @@ -177,13 +284,9 @@ static void MaxPlayers_f (void) } n = atoi(Cmd_Argv(1)); - if (n < 1) - n = 1; - if (n > svs.maxclientslimit) - { - n = svs.maxclientslimit; + n = bound(1, n, MAX_SCOREBOARD); + if (svs.maxclients != n) Con_Printf ("\"maxplayers\" set to \"%u\"\n", n); - } if ((n == 1) && listening) Cbuf_AddText ("listen 0\n"); @@ -191,7 +294,7 @@ static void MaxPlayers_f (void) if ((n > 1) && (!listening)) Cbuf_AddText ("listen 1\n"); - svs.maxclients = n; + SV_SetMaxClients(n); } @@ -224,6 +327,12 @@ static void NET_Port_f (void) } +static void NET_Heartbeat_f (void) +{ + NET_Heartbeat (2); +} + + static void PrintSlistHeader(void) { Con_Printf("Server Map Users\n"); @@ -252,31 +361,51 @@ static void PrintSlistTrailer(void) if (hostCacheCount) Con_Printf("== end list ==\n\n"); else - Con_Printf("No Quake servers found.\n\n"); + { + if (gamemode == GAME_TRANSFUSION) + Con_Printf("No Transfusion servers found.\n\n"); + else + Con_Printf("No Quake servers found.\n\n"); + } } -void NET_Slist_f (void) +void NET_SlistCommon (PollProcedure *sendProcedure, PollProcedure *pollProcedure) { if (slistInProgress) return; if (! slistSilent) { - Con_Printf("Looking for Quake servers...\n"); + if (gamemode == GAME_TRANSFUSION) + Con_Printf("Looking for Transfusion servers...\n"); + else + Con_Printf("Looking for Quake servers...\n"); PrintSlistHeader(); } slistInProgress = true; slistStartTime = Sys_DoubleTime(); - SchedulePollProcedure(&slistSendProcedure, 0.0); - SchedulePollProcedure(&slistPollProcedure, 0.1); + SchedulePollProcedure(sendProcedure, 0.0); + SchedulePollProcedure(pollProcedure, 0.1); hostCacheCount = 0; } +void NET_Slist_f (void) +{ + NET_SlistCommon (&slistSendProcedure, &slistPollProcedure); +} + + +void NET_InetSlist_f (void) +{ + NET_SlistCommon (&inetSlistSendProcedure, &inetSlistPollProcedure); +} + + static void Slist_Send(void) { for (net_driverlevel=0; net_driverlevel < net_numdrivers; net_driverlevel++) @@ -321,6 +450,60 @@ static void Slist_Poll(void) } +static void InetSlist_Send(void) +{ + const char* host; + + if (!slistInProgress) + return; + + while ((host = Master_BuildGetServers ()) != NULL) + { + for (net_driverlevel=0; net_driverlevel < net_numdrivers; net_driverlevel++) + { + if (!slistLocal && net_driverlevel == 0) + continue; + if (net_drivers[net_driverlevel].initialized == false) + continue; + dfunc.SearchForInetHosts (host); + } + } + + if ((Sys_DoubleTime() - slistStartTime) < 3.5) + SchedulePollProcedure(&inetSlistSendProcedure, 1.0); +} + + +static void InetSlist_Poll(void) +{ + for (net_driverlevel=0; net_driverlevel < net_numdrivers; net_driverlevel++) + { + if (!slistLocal && net_driverlevel == 0) + continue; + if (net_drivers[net_driverlevel].initialized == false) + continue; + // We stop as soon as we have one answer (FIXME: bad...) + if (dfunc.SearchForInetHosts (NULL)) + slistInProgress = false; + } + + if (! slistSilent) + PrintSlist(); + + if (slistInProgress && (Sys_DoubleTime() - slistStartTime) < 4.0) + { + SchedulePollProcedure(&inetSlistPollProcedure, 0.1); + return; + } + + if (! slistSilent) + PrintSlistTrailer(); + slistInProgress = false; + slistSilent = false; + slistLocal = true; +} + + /* =================== NET_Connect @@ -593,6 +776,34 @@ qboolean NET_CanSendMessage (qsocket_t *sock) } +/* +==================== +NET_Heartbeat + +Send an heartbeat to the master server(s) +==================== +*/ +void NET_Heartbeat (int priority) +{ + const char* host; + + if (! Master_AllowHeartbeat (priority)) + return; + + while ((host = Master_BuildHeartbeat ()) != NULL) + { + for (net_driverlevel=0 ; net_driverlevelnext) - NET_Close(sock); + while (net_activeSockets) + NET_Close(net_activeSockets); // // shutdown the drivers