Skip to content

Commit a08b6ae

Browse files
committed
engine: update server info reply
1 parent 64f7bf9 commit a08b6ae

File tree

4 files changed

+95
-32
lines changed

4 files changed

+95
-32
lines changed

engine/masterserver.cpp

Lines changed: 89 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@
1616
#include "master.h"
1717
#include "proto_oob.h"
1818
#include "host.h"
19+
#include "eiface.h"
20+
#include "server.h"
1921

22+
extern ConVar sv_tags;
2023
extern ConVar sv_lan;
2124

25+
#define S2A_EXTRA_DATA_HAS_GAMETAG_DATA 0x01 // Next bytes are the game tag string
26+
2227
//-----------------------------------------------------------------------------
2328
// Purpose: List of master servers and some state info about them
2429
//-----------------------------------------------------------------------------
@@ -65,6 +70,8 @@ class CMaster : public IMaster, public IServersInfo
6570

6671
void RunFrame();
6772
void RequestServersInfo();
73+
void ReplyInfo( const netadr_t &adr );
74+
newgameserver_t &ProcessInfo( bf_read &buf );
6875

6976
// SeversInfo
7077
void RequestInternetServerList( const char *gamedir, IServerListResponse *response );
@@ -116,6 +123,79 @@ void CMaster::RunFrame()
116123
CheckHeartbeat();
117124
}
118125

126+
void CMaster::ReplyInfo( const netadr_t &adr )
127+
{
128+
static char gamedir[MAX_OSPATH];
129+
Q_FileBase( com_gamedir, gamedir, sizeof( gamedir ) );
130+
131+
CUtlBuffer buf;
132+
buf.EnsureCapacity( 2048 );
133+
134+
buf.PutUnsignedInt( LittleDWord( CONNECTIONLESS_HEADER ) );
135+
buf.PutUnsignedChar( S2C_INFOREPLY );
136+
137+
buf.PutUnsignedChar( PROTOCOL_VERSION ); // Hardcoded protocol version number
138+
buf.PutString( sv.GetName() );
139+
buf.PutString( sv.GetMapName() );
140+
buf.PutString( gamedir );
141+
buf.PutString( serverGameDLL->GetGameDescription() );
142+
143+
// player info
144+
buf.PutUnsignedChar( sv.GetNumClients() );
145+
buf.PutUnsignedChar( sv.GetMaxClients() );
146+
buf.PutUnsignedChar( sv.GetNumFakeClients() );
147+
148+
// Password?
149+
buf.PutUnsignedChar( sv.GetPassword() != NULL ? 1 : 0 );
150+
151+
// Write a byte with some flags that describe what is to follow.
152+
const char *pchTags = sv_tags.GetString();
153+
int nFlags = 0;
154+
155+
if ( pchTags && pchTags[0] != '\0' )
156+
nFlags |= S2A_EXTRA_DATA_HAS_GAMETAG_DATA;
157+
158+
buf.PutUnsignedInt( nFlags );
159+
160+
if ( nFlags & S2A_EXTRA_DATA_HAS_GAMETAG_DATA )
161+
{
162+
buf.PutString( pchTags );
163+
}
164+
165+
NET_SendPacket( NULL, NS_SERVER, adr, (unsigned char *)buf.Base(), buf.TellPut() );
166+
}
167+
168+
newgameserver_t &CMaster::ProcessInfo(bf_read &buf)
169+
{
170+
static newgameserver_t s;
171+
memset( &s, 0, sizeof(s) );
172+
173+
s.m_nProtocolVersion = buf.ReadByte();
174+
175+
buf.ReadString( s.m_szServerName, sizeof(s.m_szServerName) );
176+
buf.ReadString( s.m_szMap, sizeof(s.m_szMap) );
177+
buf.ReadString( s.m_szGameDir, sizeof(s.m_szGameDir) );
178+
179+
buf.ReadString( s.m_szGameDescription, sizeof(s.m_szGameDescription) );
180+
181+
// player info
182+
s.m_nPlayers = buf.ReadByte();
183+
s.m_nMaxPlayers = buf.ReadByte();
184+
s.m_nBotPlayers = buf.ReadByte();
185+
186+
// Password?
187+
s.m_bPassword = buf.ReadByte();
188+
189+
s.m_iFlags = buf.ReadLong();
190+
191+
if( s.m_iFlags & S2A_EXTRA_DATA_HAS_GAMETAG_DATA )
192+
{
193+
buf.ReadString( s.m_szGameTags, sizeof(s.m_szGameTags) );
194+
}
195+
196+
return s;
197+
}
198+
119199
void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
120200
{
121201
static ALIGN4 char string[2048] ALIGN4_POST; // Buffer for sending heartbeat
@@ -158,27 +238,24 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
158238
}
159239
case C2S_INFOREQUEST:
160240
{
161-
bf_write p(string, sizeof(string));
162-
p.WriteLong(CONNECTIONLESS_HEADER);
163-
p.WriteByte(S2C_INFOREPLY);
164-
p.WriteString(sv.GetName());
165-
166-
NET_SendPacket(NULL, NS_SERVER, packet->from, p.GetData(), p.GetNumBytesWritten());
167-
241+
ReplyInfo(packet->from);
168242
break;
169243
}
170244
case S2C_INFOREPLY:
171245
{
172-
char hostname[1024];
173-
msg.ReadString(hostname, sizeof(hostname));
246+
newgameserver_t &s = ProcessInfo( msg );
247+
Msg("hostname = %s\nplayers: %d/%d\nbots: %d\n", s.m_szServerName, s.m_nPlayers, s.m_nMaxPlayers, s.m_nBotPlayers);
174248

175-
newgameserver_t s;
176249
s.m_NetAdr = packet->from;
177-
s.SetName( hostname );
178-
179250
m_serverListResponse->ServerResponded( s );
180251
break;
181252
}
253+
case A2A_PING:
254+
{
255+
const char p = A2A_ACK;
256+
NET_SendPacket( NULL, NS_SERVER, packet->from, (unsigned char*)&p, 1);
257+
break;
258+
}
182259
}
183260
}
184261

public/engine/iserversinfo.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,23 @@ class newgameserver_t
2525
public:
2626
newgameserver_t() = default;
2727

28-
const char* GetName() const { return m_szServerName; }
29-
void SetName( const char *pName )
30-
{
31-
strncpy( m_szServerName, pName, sizeof(m_szServerName) );
32-
}
33-
3428
netadr_t m_NetAdr; ///< IP/Query Port/Connection Port for this server
3529
int m_nPing; ///< current ping time in milliseconds
30+
int m_nProtocolVersion;
3631
bool m_bHadSuccessfulResponse; ///< server has responded successfully in the past
3732
bool m_bDoNotRefresh; ///< server is marked as not responding and should no longer be refreshed
3833
char m_szGameDir[MAX_PATH]; ///< current game directory
3934
char m_szMap[MAX_PATH]; ///< current map
35+
char m_szGameTags[MAX_PATH];
4036
char m_szGameDescription[MAX_GAME_DESCRIPTION]; ///< game description
4137

4238
int m_nPlayers;
4339
int m_nMaxPlayers; ///< Maximum players that can join this server
4440
int m_nBotPlayers; ///< Number of bots (i.e simulated players) on this server
4541
bool m_bPassword; ///< true if this server needs a password to join
46-
private:
42+
43+
int m_iFlags;
44+
4745
/// Game server name
4846
char m_szServerName[MAX_SERVER_NAME];
4947
};

serverbrowser/BaseGamesPage.cpp

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2203,8 +2203,6 @@ const char *CBaseGamesPage::GetConnectCode()
22032203

22042204
void CBaseGamesPage::ServerResponded( newgameserver_t &server )
22052205
{
2206-
Msg("Serverbrowser: hostname %s\n", server.GetName());
2207-
22082206
Assert( server.m_NetAdr.GetIPHostByteOrder() != 0 );
22092207

22102208
newgameserver_t *pServerItem = &server;
@@ -2232,7 +2230,7 @@ void CBaseGamesPage::ServerResponded( newgameserver_t &server )
22322230
// new entry
22332231
KeyValues *kv = new KeyValues("Server");
22342232

2235-
kv->SetString("name", pServerItem->GetName());
2233+
kv->SetString("name", pServerItem->m_szServerName);
22362234
kv->SetString("map", pServerItem->m_szMap);
22372235
kv->SetString("GameDir", pServerItem->m_szGameDir);
22382236
kv->SetString("GameDesc", pServerItem->m_szGameDescription);
@@ -2278,15 +2276,6 @@ void CBaseGamesPage::ServerResponded( newgameserver_t &server )
22782276
}
22792277
}*/
22802278

2281-
// if ( pServer->m_bDoNotRefresh )
2282-
{
2283-
// clear out the vars
2284-
kv->SetString("Ping", "");
2285-
kv->SetWString("GameDesc", g_pVGuiLocalize->Find("#ServerBrowser_NotResponding"));
2286-
kv->SetString("Players", "");
2287-
kv->SetString("map", "");
2288-
}
2289-
22902279
int iServerIndex = m_serversInfo.AddToTail( server );
22912280

22922281
//if ( !m_pGameList->IsValidItemID( pServer->m_iListID ) )

serverbrowser/InternetGames.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ void CInternetGames::OnTick()
127127
void CInternetGames::ServerResponded( newgameserver_t &server )
128128
{
129129
m_bDirty = true;
130-
Msg("InternetGames::ServerResponded hostname = %s\n", server.GetName());
131130

132131
BaseClass::ServerResponded( server );
133132
m_bAnyServersRespondedToQuery = true;

0 commit comments

Comments
 (0)