Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
9dc77b1
Create DynamicFPS.h
losininterest1 Mar 29, 2026
0568c03
Delete src/Client/Module/Modules/Misc/DynamicFPS.h
losininterest1 Mar 29, 2026
85bce95
Create DynamicFPS
losininterest1 Mar 29, 2026
979341d
Delete src/Client/Module/Modules/Misc/DynamicFPS
losininterest1 Mar 29, 2026
00cab18
Create DynamicFPS.h
losininterest1 Mar 29, 2026
38f1e6e
Delete src/Client/Module/Modules/Misc/DynamicFPS directory
losininterest1 Mar 29, 2026
b95f7a8
Create DynamicFPS.h
losininterest1 Mar 29, 2026
82e5c66
Delete src/Client/Module/Modules/Misc/DynamicFPS directory
losininterest1 Mar 29, 2026
e6c6457
Create DynamicFPS.hpp
losininterest1 Mar 29, 2026
15a4a0e
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
cf41e88
Create DynamicFPS.cpp
losininterest1 Mar 29, 2026
cb764f2
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
56e62c0
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
a22f005
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
12ac53a
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
fb42599
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
d4abe53
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
2dcdda0
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
57834d6
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
0aa5743
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
8f464e2
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
477324e
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
8ace13f
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
c02b875
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
630ca7b
Update Manager.hpp
losininterest1 Mar 29, 2026
1761734
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
88c2db2
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
f7a9278
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
b0604a5
Update Manager.hpp
losininterest1 Mar 29, 2026
3ad84d5
Update Manager.cpp
losininterest1 Mar 29, 2026
e79e2c1
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
e671232
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
6b4c040
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
575fe25
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
15670ac
Update DynamicFPS.cpp
losininterest1 Mar 29, 2026
86225e4
Update DynamicFPS.hpp
losininterest1 Mar 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Client/Module/Manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@
#include "Modules/PitchDisplay/PitchDisplay.hpp"
#include "Modules/ExperienceInfo/ExperienceInfo.hpp"
#include "Modules/DurabilityWarning/DurabilityWarning.hpp"
#include "Modules/Misc/DynamicFPS/DynamicFPS.hpp"
// #include "Modules/PanoramaShader/PanoramaShader.hpp" // Uses CubemapBackgroundScreenRenderHook (render thread safe)

#ifdef COMPILE_DOOM
Expand Down
61 changes: 61 additions & 0 deletions src/Client/Module/Modules/Misc/DynamicFPS/DynamicFPS.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Updated 1:52 UTC+8 by Leqixn

#include "DynamicFPS.hpp"
#include "SDK/SDK.hpp"
#include <Windows.h>

void DynamicFPS::onTick() {
if (!enabled.boolValue) return;

auto context = GameContext::getInstance();
if (!context || !context->getClientInstance()) return;

auto options = context->getClientInstance()->getOptions();
if (!options) return;

HWND foreground = GetForegroundWindow();
char className[256];
if (GetClassNameA(foreground, className, sizeof(className))) {

bool isGameFocused = (strcmp(className, "ApplicationFrameWindow") == 0 ||
strcmp(className, "Windows.UI.Core.CoreWindow") == 0);

bool shouldThrottle = !isGameFocused || isAFK();

if (shouldThrottle) {
if (!isThrottled) {
originalLimit = options->framerateLimit;
isThrottled = true;
}
options->framerateLimit = !isGameFocused ? (int)unfocusedFPS.floatValue : (int)afkFPS.floatValue;
}
else if (isThrottled) {
if (originalLimit.has_value()) {
options->framerateLimit = originalLimit.value();
}
isThrottled = false;
}
}
}

bool DynamicFPS::isAFK() const {
LASTINPUTINFO lii = { sizeof(LASTINPUTINFO) };
if (GetLastInputInfo(&lii)) {
uint64_t idleSeconds = (GetTickCount64() - lii.dwTime) / 1000;
return idleSeconds >= static_cast<uint64_t>(afkTimeout.floatValue);
}
return false;
}

void DynamicFPS::onDisable() {
if (isThrottled && originalLimit.has_value()) {
auto context = GameContext::getInstance();
if (context && context->getClientInstance()) {
auto options = context->getClientInstance()->getOptions();
if (options) {
options->framerateLimit = originalLimit.value();
}
}
}
isThrottled = false;
}
31 changes: 31 additions & 0 deletions src/Client/Module/Modules/Misc/DynamicFPS/DynamicFPS.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Updated 1:54 UTC+8 by Leqixn

#pragma once
#include "Modules/Module.hpp"
#include <optional>

class DynamicFPS : public Module {
public:
DynamicFPS() : Module("DynamicFPS", "Misc", "Reduces FPS while AFK or on other Tab") {
this->name = "DynamicFPS";

addSetting(&enabled);
addSetting(&unfocusedFPS);
addSetting(&afkFPS);
addSetting(&afkTimeout);
}

Setting enabled = Setting("Enabled", true);
Setting unfocusedFPS = Setting("Unfocused FPS", 20.0f, 1.0f, 60.0f);
Setting afkFPS = Setting("AFK FPS", 30.0f, 1.0f, 60.0f);
Setting afkTimeout = Setting("AFK Timeout", 60.0f, 5.0f, 300.0f);

void onTick() override;
void onDisable() override;

private:
bool isAFK() const;

std::optional<int> originalLimit;
bool isThrottled = false;
};