diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 609e10244a..055d0222a4 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -377,6 +377,9 @@ bool NetworkBase::BeginServer(uint16_t port, const std::string& address) ServerProviderEmail = gConfigNetwork.provider_email; ServerProviderWebsite = gConfigNetwork.provider_website; + if (gOpenRCT2Headless) + IsServerPlayerInvisible = true; + CheatsReset(); LoadGroups(); BeginChatLog(); @@ -691,6 +694,18 @@ NetworkGroup* NetworkBase::GetGroupByID(uint8_t id) const return nullptr; } +int32_t NetworkBase::GetTotalNumPlayers() const noexcept +{ + return static_cast(player_list.size()); +} + +int32_t NetworkBase::GetNumVisiblePlayers() const noexcept +{ + if (IsServerPlayerInvisible) + return static_cast(player_list.size() - 1); + return static_cast(player_list.size()); +} + const char* NetworkBase::FormatChat(NetworkPlayer* fromplayer, const char* text) { static std::string formatted; @@ -1568,7 +1583,7 @@ json_t NetworkBase::GetServerInfoAsJson() const { json_t jsonObj = { { "name", gConfigNetwork.server_name }, { "requiresPassword", _password.size() > 0 }, - { "version", network_get_version() }, { "players", player_list.size() }, + { "version", network_get_version() }, { "players", GetNumVisiblePlayers() }, { "maxPlayers", gConfigNetwork.maxplayers }, { "description", gConfigNetwork.server_description }, { "greeting", gConfigNetwork.server_greeting }, { "dedicated", gOpenRCT2Headless }, }; @@ -2597,7 +2612,7 @@ void NetworkBase::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacke } } - if (static_cast(gConfigNetwork.maxplayers) <= player_list.size()) + if (GetNumVisiblePlayers() >= gConfigNetwork.maxplayers) { connection.AuthStatus = NetworkAuth::Full; log_info("Connection %s: Server is full.", hostName); @@ -3209,7 +3224,12 @@ uint8_t network_get_current_player_id() int32_t network_get_num_players() { - return static_cast(OpenRCT2::GetContext()->GetNetwork().player_list.size()); + return OpenRCT2::GetContext()->GetNetwork().GetTotalNumPlayers(); +} + +int32_t network_get_num_visible_players() +{ + return OpenRCT2::GetContext()->GetNetwork().GetNumVisiblePlayers(); } const char* network_get_player_name(uint32_t index) diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index 76b971bc80..e498158def 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -42,6 +42,8 @@ public: // Common auto GetGroupIteratorByID(uint8_t id) const; NetworkPlayer* GetPlayerByID(uint8_t id) const; NetworkGroup* GetGroupByID(uint8_t id) const; + int32_t GetTotalNumPlayers() const noexcept; + int32_t GetNumVisiblePlayers() const noexcept; void SetPassword(u8string_view password); uint8_t GetDefaultGroup() const noexcept; std::string BeginLog(const std::string& directory, const std::string& midName, const std::string& filenameFormat); @@ -177,6 +179,7 @@ public: // Public common std::string ServerProviderWebsite; std::vector> player_list; std::vector> group_list; + bool IsServerPlayerInvisible = false; private: // Common Data using CommandHandler = void (NetworkBase::*)(NetworkConnection& connection, NetworkPacket& packet); diff --git a/src/openrct2/network/NetworkServerAdvertiser.cpp b/src/openrct2/network/NetworkServerAdvertiser.cpp index 6837de79bd..63e04f5eb9 100644 --- a/src/openrct2/network/NetworkServerAdvertiser.cpp +++ b/src/openrct2/network/NetworkServerAdvertiser.cpp @@ -290,7 +290,7 @@ private: json_t GetHeartbeatJson() { - uint32_t numPlayers = network_get_num_players(); + uint32_t numPlayers = network_get_num_visible_players(); json_t root = { { "token", _token }, diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 851fcfa84e..8c5a13ccb8 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -56,6 +56,7 @@ void network_flush(); [[nodiscard]] uint32_t network_get_server_tick(); [[nodiscard]] uint8_t network_get_current_player_id(); [[nodiscard]] int32_t network_get_num_players(); +[[nodiscard]] int32_t network_get_num_visible_players(); [[nodiscard]] const char* network_get_player_name(uint32_t index); [[nodiscard]] uint32_t network_get_player_flags(uint32_t index); [[nodiscard]] int32_t network_get_player_ping(uint32_t index);