A HUD for H3VR: health, weapon ammo and reserve, a compass with TNH supply and hold point indications, and more. Every panel can be customized (somewhat).
Blitz holds: the central node behind the shield nodes now confirms hits too
Fixed encryption node hit markers (Classic holds and Blitz shield nodes)
Show Detail
The hit markers went back to watching every sosig in the scene (FindObjectsOfType). The radius query introduced earlier could not see a sosig that is farther away than the radius, and shooting past 1000 m is a normal thing to do in this game; the watch stays throttled by [12 Hitmarkers] SosigScanMs and serialised with the other scans by the scan budget.
[12 Hitmarkers] WatchRadiusM is gone with it.
The X no longer stops growing at 400 m; the distance scaling is clamped at 5000 m so a very long shot still reads as an X instead of a dot.
A node destroyed by the shot disappears from the scene before the next frame, so the only trace of the hit is that a watched node vanished; a single disappearance is now a kill (red X at its last position), while the whole group going at once is still treated as the hold being cleaned up and draws nothing. This is what was swallowing the X on Blitz shield nodes, which die outright and never reach the "counts went down" check.
Node discovery now walks the scene for TNH_EncryptionTarget on the same one-second tick, next to the list the hold point keeps, and the two are unioned. A node that uses sub-targets returns from the game's own Damage() before touching any of its counters, so all four counters the watcher needs (m_numSubTargsLeft, m_numHitsLeft, m_damLeftForAHit, a sub-target's lifeLeft) are private and are now read through GameCompat reflection instead of being bound at compile time - a bound private field is exactly the kind of reference that survives the audit and then fails on a player's build.
The vanish rule counts a single disappearing node as a kill whether it had hits or sub-targets left, which is what a Blitz shield node looks like when one shot removes it.
Diagnostics also prints nodes=N, mk/sosig|node|core=n and watchfail=n, so a "no marker" report can be narrowed to discovery, detection, drawing or a swallowed exception from the log alone.
The central node of a Blitz hold (TNH_HoldPointSystemCore) confirms hits like a shield node: white X per hit once its shields are down, red X on the shot that finishes it. Both the reference to it and its health are private in the game and have no getter, so GameCompat reads them reflectively - read-only, and a build without those fields simply draws nothing.
The grenade warning still queries NearCm + 2 m around the player, which is the only range it can ever draw for.
The optional proximity reserve sweep (ScanRadiusCm) is a radius query too.
Diagnostics prints one line every five seconds: perf 5s: sosig-scan runs=… avg=…ms items=… hitmarker=N. items=0 means no sosig was found (so nothing can be flagged), hitmarker=0 means nothing was detected, and a non-zero hitmarker with nothing on screen means the marker was drawn but not visible - which is a different bug. Ask for that line when a report comes in.
1.1.2
Tried to improved performance
New [16 Performance] section, plus scan intervals for the hit markers and the grenade warning
Show Detail
The scene scans (FindObjectsOfType) ran on three separate timers that regularly came due on the same frame; ScanBudget now hands out at most one scan per frame with a gap between them, so the cost is spread instead of stacking.
The grenade reader's three scans (sosigs, FVRGrenade, PinnedGrenade) were all in one frame; they now go one per turn.
The quickbelt slot list, the player-body object list and the gun's chamber list were re-read (and re-allocated) on every data tick; they are cached with their own slow timers and reused buffers.
The fuel-cell sweep used to list every magazine in the scene once a second; it is a Physics.OverlapSphereNonAlloc radius query into a reused buffer now.
Round and calibre names come from the game as fresh strings on every tick; they are memoised, which is what was feeding the garbage collector.
Panel redraws all came due on the same frame; their first due times are staggered.
RefreshHz now defaults to 20 instead of 30 (panels redraw at their own 5-10 Hz, so nothing looks different).
[16 Performance]: ConfigPollSeconds (3), SlotScanMs (2000), FuelScanMs (2000). [12 Hitmarkers] SosigScanMs (1000) and [15 Grenade Alert] ScanMs (200) are new too.
1.1.1
Fixed compatibility with New Universal Speedloader
1.1.0
New features: Encryption nodes indications, Hit markers and Grenade warning
TNH status info improvments
The game's own health bar above your head can be hidden (it is hidden by default, the HUD has its own)
Show magazine name then held
Long names are trimmed to the panel's actual width, so dragging a panel wider lets it show more of the name
Show Detail
The compass draws one diamond per live node (red, with the same up/down floor arrow the hold and supply markers use)
The status panel's second line reads ENC <TYPE> <left>/<total>; the total is the high-water mark of the phase, because the game only ever removes a node from its list
Hit markers are world-space X quads driven from Update, drawn with the always-on-top shader so a body cannot hide them
Damage is watched, not hooked: a sosig link's integrity and a node's remaining hits only fall, so the first frame they fall is the shot. No Harmony patch is added.
[12 Hitmarkers] holds Show, HitColor, KillColor, SizeCm and LifetimeMs
A node with sub-targets never changes m_numHitsLeft: the bullet hits the sub-target, which only calls DisableSubtarg. The watcher now follows all four ways a node takes damage (hit count, sub-target count, sub-target life, damage-per-hit accumulator) plus the tendril a regenerating node snaps back to 1, and puts the X on the part that was shot.
Hit markers are sized in metres at one metre of distance, so the X covers the same slice of vision near or far.
The marker is a ring, not a projection: front sits at the top of the overlay, behind at the bottom, sides at the sides, so a grenade at the player's feet or behind him still reads. [15 Grenade Alert] IconDots sets the marker radius (1 = a dot, 2 = the compass node diamond, 4 = default).
The warning covers both kinds of grenade: a sosig's thrown one is a SosigWeapon with m_isFuseTickingDown, the player's are FVRGrenade / PinnedGrenade with m_isFused (an impact grenade counts once its fuse arms). Only a lit fuse is tracked, so a grenade sitting in a belt stays quiet.
A grenade the player is holding is skipped: his own hand is not the thing he needs a warning about.
The name comes from the item's FVRObject.DisplayName, the same source the weapon line uses, with the prefab name as a fallback; the old MAGAZINE line was a fixed string.
[15 Grenade Alert] holds NearCm (800), DangerCm (250), IconDots, MarkerColor and DangerColor. The overlay itself is the Grenades panel, so it has the usual offset/size settings and a H3UD Panels switch.
[13 Vanilla] ShowHealthBar drives GM.CurrentPlayerBody.HealthBar, which the game re-creates on every scene load, so its state is re-checked each frame.
1.0.2
Works on older game versions again (update 119 and up)
One broken read no longer blanks the whole HUD, and it is logged as an error instead of a warning
Horizon lock can be switched from the wrist menu (H3UD page) while playing
Removed the leftover config migration from 1.0.0
Show Detail
Belt-fed guns read the round count through a renamed member (NumRoundsOnBelt on 120+, BeltRounds on 119), so 119 no longer throws "Method not found" and loses the HUD
Fuel guns on builds without m_startingFuel show the fuel they have left as a plain number (FUEL 42, RES 26) with no percentage and no gauge, instead of falling back to a magazine readout that sat at 0 and warned forever
The sandbox phase is matched by name, so the 119 enum (which has no Sandbox member) still runs
Each reader (weapon / reserve / ammo in hand / other item / TNH / compass) is guarded on its own: a failure costs that panel only
Real failures are written as [Error] HUD data read failed - <section>: <exception>, once per distinct message
1.0.1
Many things and fixes
Show Detail
New reload prompt panel below the centre of the view (idea stolen from rivi)
Better display for exotic guns e.g. single shot bolt actions, flintlocks and flamethrowers
Fixed derringer next shot round type prediction
Performance fixes (hopefully)
Show item details even if they aren't guns or mags
Thing closer to your head displays first
1.0.0
Initial release
Thunderstore development is made possible with ads. Please consider making an exception to your adblock.