Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.9 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
#ifndef SERVERLIST_H
#define SERVERLIST_H
#ifdef _WIN32
#pragma once
#endif
#include "server.h"
#include "netadr.h"
#include "serverinfo.h"
#include "iresponse.h"
#include "utlrbtree.h"
class CSocket;
class IServerRefreshResponse;
// holds a single query - definition needs to be public
struct query_t
{
netadr_t addr;
int serverID;
float sendTime;
};
//-----------------------------------------------------------------------------
// Purpose: Handles a list of servers, and can refresh them
//-----------------------------------------------------------------------------
class CServerList: public IResponse
{
public:
CServerList(IServerRefreshResponse *gameList);
~CServerList();
// Handles a frame of networking
void RunFrame();
// gets a server from the list by id, range [0, ServerCount)
serveritem_t &GetServer(unsigned int serverID);
// returns the number of servers
int ServerCount();
// adds a new server to the list, returning a handle to the server
unsigned int AddNewServer(serveritem_t &server);
// starts a refresh
void StartRefresh();
// stops all refreshing
void StopRefresh();
// clears all servers from the list
void Clear();
// marks a server to be refreshed
void AddServerToRefreshList(unsigned int serverID);
// returns true if servers are currently being refreshed
bool IsRefreshing();
// returns the number of servers not yet pinged
int RefreshListRemaining();
// implementation of IRconResponse interface
// called when the server has successfully responded to an info command
virtual void ServerResponded();
// called when a server response has timed out
virtual void ServerFailedToRespond();
private:
// Run query logic for this frame
void QueryFrame();
// recalculates a servers ping, from the last few ping times
int CalculateAveragePing(serveritem_t &server);
IServerRefreshResponse *m_pResponseTarget;
enum
{
MAX_QUERY_SOCKETS = 255,
};
// holds the list of all the currently active queries
CUtlRBTree<query_t, unsigned short> m_Queries;
// list of all known servers
CUtlVector<CServerInfo *> m_Servers;
// list of servers to be refreshed, in order... this would be more optimal as a queue
CUtlVector<int> m_RefreshList;
int m_iUpdateSerialNumber; // serial number of current update so we don't get results overlapping between different server list updates
bool m_bQuerying; // Is refreshing taking place?
int m_nMaxActive; // Max # of simultaneous sockets to use for querying
int m_nMaxRampUp; // increasing number of sockets to use
int m_nRampUpSpeed; // amount to ramp up each frame
int m_nInvalidServers; // number of servers marked as 'no not refresh'
int m_nRefreshedServers; // count of servers refreshed
};
#endif // SERVERLIST_H