summaryrefslogtreecommitdiff
path: root/src/net_server.c
diff options
context:
space:
mode:
authorSimon Howard2006-04-06 20:48:35 +0000
committerSimon Howard2006-04-06 20:48:35 +0000
commitd5f0ddc20b192cf1f17b27347dd467cddf493a6d (patch)
treee4551401130657d9df1b714b28dc6b67a1e2c475 /src/net_server.c
parent7355700d83fbab08c96fa8181b5aa3938464197e (diff)
downloadchocolate-doom-d5f0ddc20b192cf1f17b27347dd467cddf493a6d.tar.gz
chocolate-doom-d5f0ddc20b192cf1f17b27347dd467cddf493a6d.tar.bz2
chocolate-doom-d5f0ddc20b192cf1f17b27347dd467cddf493a6d.zip
Add the ability to query the current state of servers, and '-query'
command line option to do so. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 464
Diffstat (limited to 'src/net_server.c')
-rw-r--r--src/net_server.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/net_server.c b/src/net_server.c
index 3a01f3b9..c57ef61a 100644
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: net_server.c 461 2006-04-06 17:53:43Z fraggle $
+// $Id: net_server.c 464 2006-04-06 20:48:35Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -1058,6 +1058,42 @@ static void NET_SV_ParseResendRequest(net_packet_t *packet, net_client_t *client
NET_SV_SendTics(client, start, last);
}
+// Send a response back to the client
+
+void NET_SV_SendQueryResponse(net_addr_t *addr)
+{
+ net_packet_t *reply;
+
+ reply = NET_NewPacket(64);
+ NET_WriteInt16(reply, NET_PACKET_TYPE_QUERY_RESPONSE);
+
+ // Version
+
+ NET_WriteString(reply, PACKAGE_STRING);
+
+ // Server state
+
+ NET_WriteInt8(reply, server_state);
+
+ // Number of players/maximum players
+
+ NET_WriteInt8(reply, NET_SV_NumClients());
+ NET_WriteInt8(reply, MAXPLAYERS);
+
+ // Game mode/mission
+
+ NET_WriteInt8(reply, sv_gamemode);
+ NET_WriteInt8(reply, sv_gamemission);
+
+ // Server description. This is currently hard-coded.
+
+ NET_WriteString(reply, "Chocolate Doom server");
+
+ // Send it and we're done.
+
+ NET_SendPacket(addr, reply);
+ NET_FreePacket(reply);
+}
// Process a packet received by the server
@@ -1083,6 +1119,10 @@ static void NET_SV_Packet(net_packet_t *packet, net_addr_t *addr)
{
NET_SV_ParseSYN(packet, client, addr);
}
+ else if (packet_type == NET_PACKET_TYPE_QUERY)
+ {
+ NET_SV_SendQueryResponse(addr);
+ }
else if (client == NULL)
{
// Must come from a valid client; ignore otherwise
@@ -1299,6 +1339,7 @@ static void NET_SV_RunClient(net_client_t *client)
if (NET_SV_NumClients() <= 0)
{
server_state = SERVER_WAITING_START;
+ sv_gamemode = indetermined;
}
}
@@ -1355,6 +1396,7 @@ void NET_SV_Init(void)
}
server_state = SERVER_WAITING_START;
+ sv_gamemode = indetermined;
server_initialised = true;
}