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