iw4x-client/src/Components/Modules/ServerList.hpp

160 lines
3.3 KiB
C++
Raw Normal View History

2017-01-20 08:36:52 -05:00
#pragma once
// This enables version filtering
#define VERSION_FILTER
namespace Components
{
class ServerList : public Component
{
public:
typedef int(SortCallback)(const void*, const void*);
class ServerInfo
{
public:
Network::Address addr;
std::string hostname;
std::string mapname;
std::string gametype;
std::string mod;
std::string shortversion;
int clients;
2017-06-12 15:01:56 -04:00
int bots;
int maxClients;
bool password;
int ping;
int matchType;
int securityLevel;
bool hardcore;
bool svRunning;
bool aimassist;
bool voice;
};
ServerList();
~ServerList();
static void Refresh(UIScript::Token);
static void RefreshVisibleList(UIScript::Token);
2022-05-07 09:23:26 -04:00
static void RefreshVisibleListInternal(UIScript::Token, bool refresh = false);
static void UpdateVisibleList(UIScript::Token);
2017-02-28 13:58:03 -05:00
static void InsertRequest(Network::Address address);
2022-06-04 04:56:14 -04:00
static void Insert(const Network::Address& address, const Utils::InfoString& info);
static ServerInfo* GetCurrentServer();
static bool IsFavouriteList();
static bool IsOfflineList();
static bool IsOnlineList();
static void Frame();
static std::vector<ServerInfo>* GetList();
2017-02-26 09:27:02 -05:00
static void UpdateVisibleInfo();
2022-05-03 03:01:54 -04:00
static bool GetMasterServer(const char* ip, int port, Game::netadr_t& address);
static bool useMasterServer;
private:
enum Column
{
Password,
Matchtype,
AimAssist,
VoiceChat,
Hostname,
Mapname,
Players,
Gametype,
Mod,
Ping,
};
static constexpr auto* FavouriteFile = "players/favourites.json";
#pragma pack(push, 1)
union MasterEntry
{
char token[7];
struct
{
uint32_t ip;
uint16_t port;
};
bool IsEndToken()
{
// End of transmission or file token
return (token[0] == 'E' && token[1] == 'O' && (token[2] == 'T' || token[2] == 'F'));
}
bool HasSeparator()
{
return (token[6] == '\\');
}
};
#pragma pack(pop)
class Container
{
public:
class ServerContainer
{
public:
bool sent;
int sendTime;
std::string challenge;
Network::Address target;
};
bool awatingList;
int awaitTime;
int sentCount;
int sendCount;
Network::Address host;
std::vector<ServerContainer> servers;
2017-02-28 13:58:03 -05:00
std::recursive_mutex mutex;
};
static unsigned int GetServerCount();
static const char* GetServerText(unsigned int index, int column);
static const char* GetServerInfoText(ServerInfo* server, int column, bool sorting = false);
static void SelectServer(unsigned int index);
static void UpdateSource();
static void UpdateGameType();
static void SortList();
static void LoadFavourties();
2018-12-17 08:29:18 -05:00
static void StoreFavourite(const std::string& server);
static void RemoveFavourite(const std::string& server);
static ServerInfo* GetServer(unsigned int index);
2018-12-17 08:29:18 -05:00
static bool CompareVersion(const std::string& version1, const std::string& version2);
static int SortKey;
static bool SortAsc;
static unsigned int CurrentServer;
static Container RefreshContainer;
static std::vector<ServerInfo> OnlineList;
static std::vector<ServerInfo> OfflineList;
static std::vector<ServerInfo> FavouriteList;
static std::vector<unsigned int> VisibleList;
2022-04-12 17:15:50 -04:00
static Dvar::Var UIServerSelected;
static Dvar::Var UIServerSelectedMap;
static Dvar::Var NETServerQueryLimit;
static Dvar::Var NETServerFrames;
static bool IsServerListOpen();
};
}