Skip to content
InputBooster
Developer DocumentationInternals

Feature managers

Every feature manager, the config key that gates it, when it is ticked and what it actually changes.

4 min readInputBooster 4.1.2-alphaMinecraft 26.2 / 26.3

Each feature is one class in dev.inputbooster.feature. Every one is ticked from the client tick and gated by a config key, by the module manager, or by both.

The tick order

The client tick runs the managers in a fixed order. The order matters: the CPS limiter must see the click before the counters do, and the replay must not advance while a screen is open.

java
if (moduleManager.enabled("profiles"))  perServerProfileManager.tick(client);
if (moduleManager.enabled("debug"))     keybindConflictDetector.tick(client);
if (moduleManager.enabled("replay") && inputAllowed) replayRecorder.tick();
if (moduleManager.enabled("movement")) {
    sprintManager.tick(client);
    wTapAssist.tick(client);
    autoStrafe.tick(client);
}
if (moduleManager.enabled("anti_idle")) antiIdle.tick(client);
if (moduleManager.enabled("combat"))    cpsLimiter.tick(client);
if (InputBoosterConfig.isBurstModeEnabled()) burstMode.tick(client);
if (safeMode != null) safeMode.tick();
sessionStats.tick(currentFps, cpsLimiter.getCps());

The drain itself happens earlier, at the head of the tick, through the GameTickMixin hook.

The managers

Movement

ClassConfig keyWhat it does
SprintManagersprint_fix, auto_sprintSets sprinting when forward is held, not sneaking, food above 6
WTapAssistwtap_assistMultiplies horizontal velocity by 0.6 on the tick after forward is released
AutoStrafeManagerauto_strafeYaw nudge of ±0.4 * (40 / FPS) while sprinting below 40 FPS

sprint_fix gates the whole manager. auto_sprint is only consulted inside it.

Combat

ClassConfig keyWhat it does
CpsLimitercps_limiter, max_cps, cps_modeToken bucket that caps attacks per second
BurstModeManagerburst_modeRaises the polling rate to 1000 Hz for 60 ticks after a frame-rate drop

The burst manager is ticked outside the module manager — it follows burst_mode directly.

Idle and diagnostics

ClassConfig keyWhat it does
AntiIdleManageranti_idleAdds 0.0001 degrees of yaw every 200 ticks
EventLogevent_logBounded in-memory list of the last 80 events
SessionStats—Session counters and the 60-second CPS graph
LatencyProfiler—Rolling window of queue-to-drain times
KeybindConflictDetectorkey_conflict_warnOne-shot scan for two bindings on the same key
DebugOverlayManagershow_f3_infoOwns the decision to draw the overlay
OverlayRenderer, OverlayLayoutoverlay_*Draws the panel and places it

Features

ClassConfig keyWhat it does
ReplayRecorderreplay_enabledRecords and replays queued actions
ProfileManager—Loads and saves profiles
PerServerProfileManagerper_server_profilesDetects the server and applies the bound profile
InputClickSoundManagerclick_soundsPlays a UI click for executed actions

Infrastructure

ClassConfig keyWhat it does
ModuleManager—Runtime on/off switches for seven modules
SafeModeManagersafe_modeDisables a module after five errors in ten seconds
ConfigTools—Import, export and presets — never called by the UI

The module manager

ModuleManager holds seven runtime switches:

java
runtime.put("input", true);
runtime.put("combat", true);
runtime.put("movement", true);
runtime.put("debug", true);
runtime.put("profiles", true);
runtime.put("anti_idle", true);
runtime.put("replay", true);

enabled() combines the runtime switch with the config:

ModuleAlso requires
combatcps_limiter
movementAny of sprint_fix, auto_sprint, wtap_assist, auto_strafe
debugshow_f3_info or event_log
profilesper_server_profiles
anti_idleanti_idle
replayreplay_enabled
inputNothing — this is the execution layer itself

The runtime switch is what Safe Mode flips.

Safe Mode

SafeModeManager counts errors per module inside a rolling ten-second window:

java
private static final long WINDOW_MS = 10_000L;
private static final int ERROR_THRESHOLD = 5;

When a module crosses the threshold, only that module is disabled and the window resets. The rest of the mod keeps working. The module is re-enabled after a full quiet window, so a transient failure self-heals.

The modules Safe Mode can act on are the seven the module manager knows. An error source that is not one of them — client tick, for example — is counted and reported, but it cannot grow the module manager's key set.

Writing a new feature

The pattern every feature follows:

Add the config key

A volatile field in InputBoosterConfig, a getter, a setter that clamps, a line in load(), a line in save() and a line in resetDefaults().

Add the manager

One class in the feature package with a tick(Minecraft) method that returns immediately when the config flag is off.

Wire it into the tick

Create it in initialize(), tick it in onClientTick() behind the module manager.

Add the control

A row in the settings screen. Every control must write a real config value.

Add it to the profile

Only if it should travel with a profile, and only if the field is added to the Profile record, toJson, fromJson and apply.