// net_main.c
#include "quakedef.h"
+#include "net_master.h"
qsocket_t *net_activeSockets = NULL;
mempool_t *net_mempool;
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;
static void MaxPlayers_f (void)
{
- int n;
+ int n;
if (Cmd_Argc () != 2)
{
}
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");
if ((n > 1) && (!listening))
Cbuf_AddText ("listen 1\n");
- svs.maxclients = n;
+ SV_SetMaxClients(n);
}
}
+static void NET_Heartbeat_f (void)
+{
+ NET_Heartbeat (2);
+}
+
+
static void PrintSlistHeader(void)
{
Con_Printf("Server Map Users\n");
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++)
}
+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
}
+/*
+====================
+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_driverlevel<net_numdrivers; net_driverlevel++)
+ {
+ if (net_drivers[net_driverlevel].initialized == false)
+ continue;
+ if (net_driverlevel && listening == false)
+ continue;
+ dfunc.Heartbeat (host);
+ }
+ }
+}
+
+
int NET_SendToAll(sizebuf_t *data, int blocktime)
{
double start;
}
net_hostport = DEFAULTnet_hostport;
- if (COM_CheckParm("-listen") || cls.state == ca_dedicated || gamemode == GAME_BLOODBATH)
+ if (COM_CheckParm("-listen") || cls.state == ca_dedicated || gamemode == GAME_TRANSFUSION)
listening = true;
SetNetTime();
Cvar_RegisterVariable (&net_messagetimeout);
Cvar_RegisterVariable (&hostname);
- Cmd_AddCommand ("slist", NET_Slist_f);
+ Cmd_AddCommand ("net_slist", NET_Slist_f);
+ Cmd_AddCommand ("net_inetslist", NET_InetSlist_f);
Cmd_AddCommand ("listen", NET_Listen_f);
Cmd_AddCommand ("maxplayers", MaxPlayers_f);
Cmd_AddCommand ("port", NET_Port_f);
+ Cmd_AddCommand ("heartbeat", NET_Heartbeat_f);
// initialize all the drivers
for (net_driverlevel=0 ; net_driverlevel<net_numdrivers ; net_driverlevel++)
Con_DPrintf("IPX address %s\n", my_ipx_address);
if (*my_tcpip_address)
Con_DPrintf("TCP/IP address %s\n", my_tcpip_address);
+
+ Master_Init ();
}
/*
====================
*/
-void NET_Shutdown (void)
+void NET_Shutdown (void)
{
- qsocket_t *sock;
-
SetNetTime();
- for (sock = net_activeSockets;sock;sock = net_activeSockets)
- NET_Close(sock);
+ while (net_activeSockets)
+ NET_Close(net_activeSockets);
//
// shutdown the drivers