1#include <engine/shared/masterserver.h>
2
3#include <game/client/gameclient.h>
4
5void CClient::PreprocessConnlessPacket7(CNetChunk *pPacket)
6{
7 if(mem_comp(a: pPacket->m_pData, b: SERVERBROWSE_INFO, size: sizeof(SERVERBROWSE_INFO)) == 0)
8 {
9 CUnpacker Up;
10 Up.Reset(pData: (unsigned char *)pPacket->m_pData + sizeof(SERVERBROWSE_INFO), Size: pPacket->m_DataSize - sizeof(SERVERBROWSE_INFO));
11 CServerInfo Info;
12 mem_zero(block: &Info, size: sizeof(CServerInfo));
13
14 auto GetString = [&Up](auto &Buf) {
15 str_copy(Buf, Up.GetString(SanitizeType: CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES));
16 };
17
18 TOKEN Token = Up.GetInt();
19 GetString(Info.m_aVersion);
20 GetString(Info.m_aName);
21 str_clean_whitespaces(str: Info.m_aName);
22
23 Up.GetString(SanitizeType: CUnpacker::SANITIZE_CC | CUnpacker::SKIP_START_WHITESPACES); // Hostname
24 GetString(Info.m_aMap);
25 GetString(Info.m_aGameType);
26 Info.m_Flags = Up.GetInt();
27 Up.GetInt(); // Server level
28 Info.m_NumPlayers = Up.GetInt();
29 Info.m_MaxPlayers = Up.GetInt();
30 Info.m_NumClients = Up.GetInt();
31 Info.m_MaxClients = Up.GetInt();
32
33 for(int i = 0; i < Info.m_NumClients; i++)
34 {
35 GetString(Info.m_aClients[i].m_aName);
36 GetString(Info.m_aClients[i].m_aClan);
37 Info.m_aClients[i].m_Country = Up.GetInt();
38 Info.m_aClients[i].m_Score = Up.GetInt();
39 Info.m_aClients[i].m_Player = !(Up.GetInt() & 1);
40 }
41
42 const bool IsNotVanilla = Info.m_MaxPlayers > VANILLA_MAX_CLIENTS || Info.m_MaxClients > VANILLA_MAX_CLIENTS;
43 CPacker Packer;
44 Packer.Reset();
45
46 auto PutInt = [&Packer](int Num) {
47 char aBuf[16];
48 str_format(buffer: aBuf, buffer_size: sizeof(aBuf), format: "%d", Num);
49 Packer.AddString(pStr: aBuf);
50 };
51
52 if(!IsNotVanilla)
53 {
54 Token = Token & 0xff;
55 }
56 PutInt(Token);
57 Packer.AddString(pStr: Info.m_aVersion);
58 Packer.AddString(pStr: Info.m_aName);
59 Packer.AddString(pStr: Info.m_aMap);
60
61 if(IsNotVanilla)
62 {
63 PutInt(0); // map crc
64 PutInt(0); // map size
65 }
66
67 Packer.AddString(pStr: Info.m_aGameType);
68
69 PutInt(Info.m_Flags);
70 PutInt(Info.m_NumPlayers);
71 PutInt(Info.m_MaxPlayers);
72 PutInt(Info.m_NumClients);
73 PutInt(Info.m_MaxClients);
74
75 if(IsNotVanilla)
76 {
77 Packer.AddString(pStr: ""); // extra info, reserved
78 }
79
80 for(int i = 0; i < Info.m_NumClients; i++)
81 {
82 Packer.AddString(pStr: Info.m_aClients[i].m_aName);
83 Packer.AddString(pStr: Info.m_aClients[i].m_aClan);
84
85 PutInt(Info.m_aClients[i].m_Country);
86 PutInt(Info.m_aClients[i].m_Score);
87 PutInt(Info.m_aClients[i].m_Player);
88
89 if(IsNotVanilla)
90 {
91 Packer.AddString(pStr: ""); // extra info, reserved
92 }
93 }
94
95 if(IsNotVanilla)
96 {
97 mem_copy(dest: (unsigned char *)pPacket->m_pData, source: SERVERBROWSE_INFO_EXTENDED, size: sizeof(SERVERBROWSE_INFO_EXTENDED));
98 }
99 mem_copy(dest: (unsigned char *)pPacket->m_pData + SERVERBROWSE_SIZE, source: Packer.Data(), size: Packer.Size());
100 pPacket->m_DataSize = SERVERBROWSE_SIZE + Packer.Size();
101 }
102}
103