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
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
|