#pragma once #include "core/convar/convar.h" struct ServerPresence { public: int m_iPort; std::string m_sServerId; std::string m_sServerName; std::string m_sServerDesc; char m_Password[256]; // probably bigger than will ever be used in practice, lol char m_MapName[32]; char m_PlaylistName[64]; bool m_bIsSingleplayerServer; // whether the server started in sp int m_iPlayerCount; int m_iMaxPlayers; ServerPresence() { memset(this, 0, sizeof(this)); } ServerPresence(const ServerPresence* obj) { m_iPort = obj->m_iPort; m_sServerId = obj->m_sServerId; m_sServerName = obj->m_sServerName; m_sServerDesc = obj->m_sServerDesc; memcpy(m_Password, obj->m_Password, sizeof(m_Password)); memcpy(m_MapName, obj->m_MapName, sizeof(m_MapName)); memcpy(m_PlaylistName, obj->m_PlaylistName, sizeof(m_PlaylistName)); m_iPlayerCount = obj->m_iPlayerCount; m_iMaxPlayers = obj->m_iMaxPlayers; } }; class ServerPresenceReporter { public: virtual void CreatePresence(const ServerPresence* pServerPresence) {} virtual void ReportPresence(const ServerPresence* pServerPresence) {} virtual void DestroyPresence(const ServerPresence* pServerPresence) {} virtual void RunFrame(double flCurrentTime, const ServerPresence* pServerPresence) {} }; class ServerPresenceManager { private: ServerPresence m_ServerPresence; bool m_bHasPresence = false; bool m_bFirstPresenceUpdate = false; std::vector<ServerPresenceReporter*> m_vPresenceReporters; double m_flLastPresenceUpdate = 0; ConVar* Cvar_ns_server_presence_update_rate; ConVar* Cvar_ns_server_name; ConVar* Cvar_ns_server_desc; ConVar* Cvar_ns_server_password; ConVar* Cvar_ns_report_server_to_masterserver; ConVar* Cvar_ns_report_sp_server_to_masterserver; public: void AddPresenceReporter(ServerPresenceReporter* reporter); void CreateConVars(); void CreatePresence(); void DestroyPresence(); void RunFrame(double flCurrentTime); void SetPort(const int iPort); void SetName(const std::string sServerNameUnicode); void SetDescription(const std::string sServerDescUnicode); void SetPassword(const char* pPassword); void SetMap(const char* pMapName, bool isInitialising = false); void SetPlaylist(const char* pPlaylistName); void SetPlayerCount(const int iPlayerCount); }; extern ServerPresenceManager* g_pServerPresence;