about summary refs log tree commit diff
path: root/src/versionsrv
diff options
context:
space:
mode:
Diffstat (limited to 'src/versionsrv')
-rw-r--r--src/versionsrv/versionsrv.cpp71
-rw-r--r--src/versionsrv/versionsrv.h27
2 files changed, 96 insertions, 2 deletions
diff --git a/src/versionsrv/versionsrv.cpp b/src/versionsrv/versionsrv.cpp
index 1ca3835f..d36fba3b 100644
--- a/src/versionsrv/versionsrv.cpp
+++ b/src/versionsrv/versionsrv.cpp
@@ -6,8 +6,54 @@
 
 #include "versionsrv.h"
 
+enum {
+	MAX_MAPS_PER_PACKET=48,
+	MAX_PACKETS=16,
+	MAX_MAPS=MAX_MAPS_PER_PACKET*MAX_PACKETS,
+};
+
+struct CPacketData
+{
+	int m_Size;
+	struct {
+		unsigned char m_aHeader[sizeof(VERSIONSRV_MAPLIST)];
+		CMapVersion m_aMaplist[MAX_MAPS_PER_PACKET];
+	} m_Data;
+};
+
+CPacketData m_aPackets[MAX_PACKETS];
+static int m_NumPackets = 0;
+
 static CNetClient g_NetOp; // main
 
+void BuildPackets()
+{
+	CMapVersion *pCurrent = &s_aMapVersionList[0];
+	int ServersLeft = s_NumMapVersionItems;
+	m_NumPackets = 0;
+	while(ServersLeft && m_NumPackets < MAX_PACKETS)
+	{
+		int Chunk = ServersLeft;
+		if(Chunk > MAX_MAPS_PER_PACKET)
+			Chunk = MAX_MAPS_PER_PACKET;
+		ServersLeft -= Chunk;
+		
+		// copy header	
+		mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, VERSIONSRV_MAPLIST, sizeof(VERSIONSRV_MAPLIST));
+		
+		// copy map versions
+		for(int i = 0; i < Chunk; i++)
+		{
+			m_aPackets[m_NumPackets].m_Data.m_aMaplist[i] = *pCurrent;
+			pCurrent++;
+		}
+		
+		m_aPackets[m_NumPackets].m_Size = sizeof(VERSIONSRV_MAPLIST) + sizeof(CMapVersion)*Chunk;
+		
+		m_NumPackets++;
+	}
+}
+
 void SendVer(NETADDR *pAddr)
 {
 	CNetChunk p;
@@ -33,8 +79,15 @@ int main(int argc, char **argv) // ignore_convention
 	net_init();
 
 	mem_zero(&BindAddr, sizeof(BindAddr));
+	BindAddr.type = NETTYPE_ALL;
 	BindAddr.port = VERSIONSRV_PORT;
-	g_NetOp.Open(BindAddr, 0);
+	if(!g_NetOp.Open(BindAddr, 0))
+	{
+		dbg_msg("mastersrv", "couldn't start network");
+		return -1;
+	}
+
+	BuildPackets();
 	
 	dbg_msg("versionsrv", "started");
 	
@@ -51,6 +104,22 @@ int main(int argc, char **argv) // ignore_convention
 			{
 				SendVer(&Packet.m_Address);
 			}
+
+			if(Packet.m_DataSize == sizeof(VERSIONSRV_GETMAPLIST) &&
+				mem_comp(Packet.m_pData, VERSIONSRV_GETMAPLIST, sizeof(VERSIONSRV_GETMAPLIST)) == 0)
+			{
+				CNetChunk p;
+				p.m_ClientID = -1;
+				p.m_Address = Packet.m_Address;
+				p.m_Flags = NETSENDFLAG_CONNLESS;
+				
+				for(int i = 0; i < m_NumPackets; i++)
+				{
+					p.m_DataSize = m_aPackets[i].m_Size;
+					p.m_pData = &m_aPackets[i].m_Data;
+					g_NetOp.Send(&p);
+				}
+			}
 		}
 		
 		// be nice to the CPU
diff --git a/src/versionsrv/versionsrv.h b/src/versionsrv/versionsrv.h
index 68ba04ca..03ca2f21 100644
--- a/src/versionsrv/versionsrv.h
+++ b/src/versionsrv/versionsrv.h
@@ -4,8 +4,33 @@
 #define VERSIONSRV_VERSIONSRV_H
 static const int VERSIONSRV_PORT = 8302;
 
-static const unsigned char VERSION_DATA[] = {0x00, 0, 5, 1}; // TODO 0.6: fix me
+struct CMapVersion
+{
+	char m_aName[8];
+	unsigned char m_aCrc[4];
+	unsigned char m_aSize[4];
+};
+
+static CMapVersion s_aMapVersionList[] = {
+	{"ctf1", {0xd2, 0xa8, 0x20, 0xbd}, {0x00, 0x00, 0x11, 0x9b}},
+	{"ctf2", {0xb2, 0x19, 0xe7, 0x13}, {0x00, 0x00, 0x63, 0xfc}},
+	{"ctf3", {0xe8, 0xd3, 0x39, 0xd0}, {0x00, 0x00, 0x11, 0x0e}},
+	{"ctf4", {0x09, 0xd1, 0x70, 0x1d}, {0x00, 0x00, 0x20, 0x3f}},
+	{"ctf5", {0x60, 0x7e, 0x6d, 0x7e}, {0x00, 0x00, 0x2f, 0x51}},
+	{"dm1", {0xf3, 0x5c, 0x93, 0x09}, {0x00, 0x00, 0x15, 0x75}},
+	{"dm2", {0x81, 0xe0, 0xa8, 0x9e}, {0x00, 0x00, 0x20, 0x11}},
+	{"dm6", {0xae, 0x83, 0x06, 0x9f}, {0x00, 0x00, 0x17, 0x1d}},
+	{"dm7", {0x42, 0x6d, 0xa1, 0x67}, {0x00, 0x00, 0x27, 0x2a}},
+	{"dm8", {0x92, 0x23, 0x91, 0x82}, {0x00, 0x00, 0x3a, 0x33}},
+	{"dm9", {0x48, 0xca, 0xfd, 0x11}, {0x00, 0x00, 0x18, 0x94}},
+};
+static int s_NumMapVersionItems = sizeof(s_aMapVersionList)/sizeof(CMapVersion);
+
+static const unsigned char VERSION_DATA[] = {0x00, 0, 6, 0};
 
 static const unsigned char VERSIONSRV_GETVERSION[] = {255, 255, 255, 255, 'v', 'e', 'r', 'g'};
 static const unsigned char VERSIONSRV_VERSION[] = {255, 255, 255, 255, 'v', 'e', 'r', 's'};
+
+static const unsigned char VERSIONSRV_GETMAPLIST[] = {255, 255, 255, 255, 'v', 'm', 'l', 'g'};
+static const unsigned char VERSIONSRV_MAPLIST[] = {255, 255, 255, 255, 'v', 'm', 'l', 's'};
 #endif