diff --git a/include/globed/core/game/VisualPlayer.hpp b/include/globed/core/game/VisualPlayer.hpp index 4969aad6..c1b7be6a 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 81a42c2c..449f1fdf 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", 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); this->registerSetting("core.player.death-effects", true); diff --git a/src/core/game/SettingCache.hpp b/src/core/game/SettingCache.hpp index 9666750a..6bbe4ef9 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 89619947..023b8b31 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 (!m_isLocalPlayer && 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 f526cd0b..5c69e950 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." );