GTFO
Install with App

Details

Latest version
1.0.0
Last Updated
First Uploaded
Downloads
25
Likes
0
Size
30KB
Dependants

Categories

EquipmentTimers

Small countdowns drawn inside the native GTFO equipment list (top right), immediately to the left of each equipment name. Nothing is added to the crosshair, and there is no separate panel.

Timed item What the number means
Melee weapon Seconds until the charge-up reaches full damage (m_chargeUpDone)
Primary weapon Seconds left in the current reload
Secondary weapon Seconds left in the current reload
BioTracker / class tool Seconds until the scanner can be used again

When a timer really completes, the row turns green and shows READY for a moment, and one vanilla UI sound is played. A countdown that merely reaches zero never counts as a completion.

Feedback: qingju.me | 小黑盒语音

Features

  • Native look: same TMP font asset, same font size, same font style, same renderer sorting layer as the equipment name it sits next to.
  • Anchored to both native name states, so it follows the selected full name and the compact slim name, and re-anchors when you switch gear.
  • Follows HUD scaling, resolution changes and native slot repositioning, because the label is a sibling of the native text inside the same canvas.
  • At most four rows (primary, secondary, tool, melee), one label per slot, no duplicates.
  • Neutral colour while counting (inherits the native name colour), green only for the completion cue, so green always means "ready now".
  • Client-side and read-only: no gameplay value is written, no packet is sent, reload speed, charge speed, damage and scan cooldown are untouched.
  • Bounded logging: at most 40 lines per session by default (400 with VerboseLog), never per frame.

Installation

  1. Install BepInExPack_GTFO (this is the only dependency).
  2. Drop EquipmentTimers.dll into BepInEx/plugins/ (the package already uses BepInEx/plugins/EquipmentTimers/EquipmentTimers.dll).
  3. Start GTFO. The timer appears the first time you wield a timed item.

Configuration

BepInEx/config/HawChow.EquipmentTimers.cfg (or a config editor):

Section Key Default Meaning
General Enabled true Master switch; off hides every label immediately
General ShowMeleeCharge true Melee charge-up countdown
General ShowReload true Reload countdown
General ShowScanner true BioTracker recharge countdown
General PlayReadySound true Play the one-shot ready cue
General ReadySoundEvent IMPLANTREADY Vanilla Wwise event: IMPLANTREADY, IMPLANTREADYSMALL, HUD_SCAN_COMPLETE_INDICATION, BUTTONGENERICBLIPACTIVATED, BUTTONGENERICBLIPONE, None
General ReadyHoldSeconds 0.6 How long READY stays on screen (0.2–3 s)
General OverrunGraceSeconds 2.5 Drop a countdown silently if the native action never ends (0.5–10 s)
Layout GapRatio 0.22 Gap to the native name, as a fraction of the native font size
Layout MinGap / MaxGap 2 / 40 Clamps for that gap, in canvas units
Layout LabelWidthRatio 4 Label box width as a multiple of the font size
Layout MinLabelWidth 24 Lower clamp for that width
Layout ReadyColor #6BF25A #RRGGBB or r,g,b (0-1 or 0-255)
Layout NeutralAlpha 0.92 Opacity of the neutral countdown
Debug VerboseLog false Raise the log budget to 400 lines

Known limits and accuracy

  • GTFO exposes no reload timestamp: only IsReloading and ReloadTime. The first reload segment counts down ReloadTime from the IsReloading rising edge; each further segment is estimated from the observed interval between two inserts and is prefixed with ~ (for example ~0.5s), so an estimate can never be mistaken for the native window. The row only turns green once, on the native end of the session.
  • A reload counts as completed only when the magazine is full or the clip grew during the session and the reserve that was non-empty at the start is now empty (provable natural exhaustion). Firing mid-reload therefore never turns the row green, and an unreadable reserve is never assumed empty.
  • A countdown that reaches zero while the native action is still running hides its number but keeps watching; the real completion that lands later still turns green and beeps exactly once.
  • The native HUD rebuilds itself thousands of times per second in the main menu (measured ~3.5 kHz) and hands out HUD instances that are frequently already destroyed. The mod treats those calls as an invalidation hint only: it never caches or dereferences them, and re-acquires the HUD through a throttled probe. This was the 2026-10-25 startup-crash path; with the fix the menu stays stable for 211-217 s in a row (see the project's reports/runtime-startup-failure.md).
  • A charge or reload that started before the mod could observe it (attaching mid-level, reloading while a level loads) still shows a number but ends silently, by design: the ready cue is never played for a completion the mod did not watch from the start.
  • The tool countdown follows the scanner's own m_recharging / m_rechargeStartTime / m_rechargeDuration; modded tools that do not use those fields will not show a countdown.
  • Melee "max charge hold" time is intentionally not shown: the timer stops at full charge.

Verification status (v1.0.0)

  • Build, head-less unit tests (timer completion, cancel, repeated frames, first observation, weapon switch, shell-by-shell, empty reserve, level reset, layout maths, colour parsing, bounded log) and static source guards all pass locally against the real GTFO interop assembly set.
  • Main-menu stability is verified on the release build: two consecutive runs of this exact DLL in a 26-mod r1modman profile stayed alive for 211 s and 217 s with zero Application crash events, after the 2026-10-25 startup crash was traced to the per-frame HUD postfix path and fixed.
  • In-level behaviour is not verified yet. Pixel alignment on the native name, per-row behaviour with real weapons and the audible cue still need the acceptance run; treat the layout numbers above as the contract and report any misalignment.
  • No in-game screenshot is bundled with v1.0.0 for that reason; the icon is drawn procedurally and is not evidence of in-game rendering.

Credits and licence

  • Behaviour reference: ReloadTimerPlus by Zose and MeleeTimer by long_walter. No code or asset from ReloadTimerPlus is used (it ships without an explicit licence). MeleeTimer is MIT licensed and is credited as the source of the "remaining = AutoAttackTime − elapsed, font taken from the native HUD" idea; this mod implements its own tracker, HUD anchoring and completion policy and reads MWS_ChargeUp.m_maxDamageTime from the live charge state instead of the animation data block.
  • All names, fields and events used here are the game's own (PUI_InventoryItem, Gear.MWS_ChargeUp, ItemEquippable, Gear.EnemyScanner, AK.EVENTS); no game assembly is redistributed with this package.
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.