GTFO
You are viewing a potentially older version of this package. View Latest Version
Install with App

Details

Date Uploaded
17 hours ago
Downloads
56
Size
221KB

EquipmentTimers

Persistent status and countdowns drawn inside the native GTFO equipment list (top right), immediately to the left of each equipment name. Occupied, enabled slots stay visible: neutral READY while idle, a live countdown during reload/charge/recharge, neutral -- while a sample is canceled/failed or an overrun is untrustworthy, and -- on an interrupted action's terminal frame. 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/style/sorting layer, mirrored native transform scale, and measured glyph-height fit. A shorter timer glyph is scaled to at least native height with a 10% readability margin.
  • 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 for idle/countdown/unknown status (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. Every occupied, enabled gear row remains visible; its number counts down during reload/charge/recharge.

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 shows -- instead of a guessed value but keeps watching; canceled/failed samples remain -- while reads fail, and a valid interrupted action shows -- on its terminal frame before returning to neutral idle READY. 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.7)

  • The fixed-SDK Release build, head-less timer/state-mapping tests, icon, manifest, assembly metadata and source guards pass against the installed GTFO interop set.
  • 1.0.6 was loaded in Test and its labels appeared, but the in-game check found them smaller than equipment names and hidden while idle. 1.0.7 mirrors native TMP scale, fits measured glyph height, keeps idle rows visible, and distinguishes live countdowns, terminal --, and confirmed green READY.
  • The exact 1.0.7 build still needs its post-install in-game visual recheck; no visual pass is claimed here. The 1.0.0 main-menu run and its 211/217-second stability result are historical and do not verify this build.
  • No 1.0.7 gameplay screenshot is bundled. The package icon is artwork, 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.