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