From 34d454b84d6487e56d3be1e6ad57e6c4be8e402b Mon Sep 17 00:00:00 2001 From: Master Struct Date: Sat, 11 Jul 2026 16:02:22 +0300 Subject: [PATCH 1/3] Add option to hide AFK players with configurable countdown --- include/globed/core/game/VisualPlayer.hpp | 4 ++++ src/core/SettingsManager.cpp | 3 +++ src/core/game/SettingCache.hpp | 2 ++ src/core/game/VisualPlayer.cpp | 12 ++++++++++++ src/ui/settings/SettingsLayer.cpp | 8 ++++++++ 5 files changed, 29 insertions(+) diff --git a/include/globed/core/game/VisualPlayer.hpp b/include/globed/core/game/VisualPlayer.hpp index 4969aad68..c1b7be6ad 100644 --- a/include/globed/core/game/VisualPlayer.hpp +++ b/include/globed/core/game/VisualPlayer.hpp @@ -5,6 +5,7 @@ #include "../../core/data/PlayerDisplayData.hpp" #include "../../core/game/PlayerStatusIcons.hpp" #include +#include namespace globed { @@ -103,6 +104,9 @@ class GLOBED_DLL VisualPlayer : public PlayerObject { // used to call onEnter, onExit bool m_prevPaused = false; + // used to track how long a player has been paused, for hide-afk + std::chrono::steady_clock::time_point m_pausedSince{}; + bool m_prevRotating = false; bool m_prevMini = false; diff --git a/src/core/SettingsManager.cpp b/src/core/SettingsManager.cpp index 81a42c2c2..25f35dc98 100644 --- a/src/core/SettingsManager.cpp +++ b/src/core/SettingsManager.cpp @@ -68,6 +68,9 @@ SettingsManager::SettingsManager() { this->registerSetting("core.player.hide-nearby-classic", false); this->registerSetting("core.player.hide-nearby-plat", false); this->registerSetting("core.player.hide-practicing", false); + this->registerSetting("core.player.hide-afk", false); + this->registerSetting("core.player.hide-afk-delay", 5.0f); + this->registerLimits("core.player.hide-afk-delay", 0.f, 60.f); this->registerSetting("core.player.status-icons", true); this->registerSetting("core.player.rotate-names", true); this->registerSetting("core.player.death-effects", true); diff --git a/src/core/game/SettingCache.hpp b/src/core/game/SettingCache.hpp index 9666750a8..6bbe4ef97 100644 --- a/src/core/game/SettingCache.hpp +++ b/src/core/game/SettingCache.hpp @@ -18,6 +18,8 @@ struct CachedSettings { bool ghostFollower = globed::setting("core.dev.ghost-follower"); bool forceVisibility = globed::setting("core.player.force-visibility"); bool hidePracticing = globed::setting("core.player.hide-practicing"); + bool hideAfk = globed::setting("core.player.hide-afk"); + float hideAfkDelay = globed::setting("core.player.hide-afk-delay"); bool hideNearbyClassic = globed::setting("core.player.hide-nearby-classic"); bool hideNearbyPlat = globed::setting("core.player.hide-nearby-plat"); bool showNames = globed::setting("core.player.show-names"); diff --git a/src/core/game/VisualPlayer.cpp b/src/core/game/VisualPlayer.cpp index 896199472..481f2fb12 100644 --- a/src/core/game/VisualPlayer.cpp +++ b/src/core/game/VisualPlayer.cpp @@ -222,8 +222,20 @@ void VisualPlayer::updateFromData( bool shouldMiscVisible = !forceHideEverything; bool shouldIconVisible = !forceHideIcon && !forceHideEverything; + bool hiddenForAfk = false; + if (g_settings.hideAfk && state.isPaused) { + auto now = std::chrono::steady_clock::now(); + if (!m_prevPaused) { + m_pausedSince = now; + } + float pausedSecs = std::chrono::duration(now - m_pausedSince).count(); + hiddenForAfk = pausedSecs >= g_settings.hideAfkDelay; + } + if (state.isPracticing && g_settings.hidePracticing) { shouldIconVisible = shouldMiscVisible = false; + } else if (hiddenForAfk) { + shouldIconVisible = shouldMiscVisible = false; } else if (!forceHideEverything) { shouldMiscVisible = ((data.isVisible && !m_playingDeathEffect) || g_settings.forceVisibility) && isNearby; if (!forceHideIcon) { diff --git a/src/ui/settings/SettingsLayer.cpp b/src/ui/settings/SettingsLayer.cpp index f526cd0b8..5c69e9504 100644 --- a/src/ui/settings/SettingsLayer.cpp +++ b/src/ui/settings/SettingsLayer.cpp @@ -340,6 +340,14 @@ void SettingsLayer::addSettings() { this->addSetting("core.player.hide-practicing", "Hide Practicing Players", "Hide players that are in practice mode." ); + this->addSetting("core.player.hide-afk", "Hide AFK Players", + "Hide players whose game has been paused for at least the duration set below." + ); + auto afkDelaySetting = this->addSetting("core.player.hide-afk-delay", "AFK Countdown (sec)", + "How long a player must stay paused before being hidden. 0 = hide instantly on pause." + ); + afkDelaySetting->setPercentageBased(false); + afkDelaySetting->setStep(1.f); this->addSetting("core.player.status-icons", "Show Status Icons", "Show icons indicating player states, such as paused, practicing, voice chatting, editor." ); From 943745e964aee38fbc829b2bd6ba58cfd90d2adc Mon Sep 17 00:00:00 2001 From: Master Struct Date: Sat, 11 Jul 2026 16:57:04 +0300 Subject: [PATCH 2/3] Fix local player's pause icon disappearing Only other players' pause icons should hide --- src/core/game/VisualPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/game/VisualPlayer.cpp b/src/core/game/VisualPlayer.cpp index 481f2fb12..023b8b312 100644 --- a/src/core/game/VisualPlayer.cpp +++ b/src/core/game/VisualPlayer.cpp @@ -223,7 +223,7 @@ void VisualPlayer::updateFromData( bool shouldIconVisible = !forceHideIcon && !forceHideEverything; bool hiddenForAfk = false; - if (g_settings.hideAfk && state.isPaused) { + if (!m_isLocalPlayer && g_settings.hideAfk && state.isPaused) { auto now = std::chrono::steady_clock::now(); if (!m_prevPaused) { m_pausedSince = now; From 37bd6eca5a196feccee16ccecfcfedd3f10f07f6 Mon Sep 17 00:00:00 2001 From: Master Struct Date: Sat, 11 Jul 2026 18:12:54 +0300 Subject: [PATCH 3/3] Change default value --- src/core/SettingsManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/SettingsManager.cpp b/src/core/SettingsManager.cpp index 25f35dc98..449f1fdf9 100644 --- a/src/core/SettingsManager.cpp +++ b/src/core/SettingsManager.cpp @@ -69,7 +69,7 @@ SettingsManager::SettingsManager() { this->registerSetting("core.player.hide-nearby-plat", false); this->registerSetting("core.player.hide-practicing", false); this->registerSetting("core.player.hide-afk", false); - this->registerSetting("core.player.hide-afk-delay", 5.0f); + this->registerSetting("core.player.hide-afk-delay", 10.0f); this->registerLimits("core.player.hide-afk-delay", 0.f, 60.f); this->registerSetting("core.player.status-icons", true); this->registerSetting("core.player.rotate-names", true);