diff options
Diffstat (limited to 'src/versionsrv')
| -rw-r--r-- | src/versionsrv/versionsrv.cpp | 71 | ||||
| -rw-r--r-- | src/versionsrv/versionsrv.h | 27 |
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 |