Skip to content

v0.6.5

Choose a tag to compare

@github-actions github-actions released this 10 May 13:54

RockSniffer PJ v0.6.5 - Path Memory Integration & Nonstop Support

This release adds Nonstop Play support to the addon overlay system, fixes several edge cases in song-start detection, and removes deprecated code and configuration that the new Path-based arrangement resolution makes unnecessary.

Headline Feature: Overlays Now Work in Nonstop Play

Previous versions could not resolve the active arrangement in Rocksmith's Nonstop Play mode. The arrangement-hash memory pointer that LaS and Score Attack rely on simply doesn't populate in Nonstop, so addons fell through to a fragile default-path heuristic and frequently rendered the wrong arrangement's sections, phrases, and tuning.

v0.6.5 introduces a new memory read for currentPath. the user's currently selected instrument path (Lead / Rhythm / Bass), read from a stable byte pointer that's populated from Rocksmith launch onward and works in every game stage including Nonstop. The currentPath field is now exposed in the standard addon JSON readout and is used by both the C# side and sniffer-poller.js as the primary fallback when the arrangement-hash pointer is unavailable.

In practice: section names, phrase iterations, and tuning name now render correctly during song-select and gameplay across Learn A Song, Score Attack, and Nonstop Play.

Memory Pointer Reference

Path is read with the following pointer chain (offsets [0x10, 0x1FC], byte read):

Edition Base Address
Beta 0x00F5C4F0
Remastered 0x00F5F570
Learn_And_Play 0x00F60570

Value mapping: 0x01 = Lead, 0x02 = Rhythm, 0x04 = Bass. Anything else resolves to empty (resolution falls through to the defensive heuristics).

The Beta and Learn_And_Play offsets follow the consistent +0x3080 / +0x4080 shift convention from the existing memory map. They are back-derived; only the Remastered base has been verified empirically. If you run Beta or LaP and observe overlay arrangement issues, please report it.

Bug Fixes

Song-start detection (hotfixes 1-4)

  • Empty-shell guard: prevents song-start from firing on an in-flight, partially-populated CDLC details object during cache resolution.
  • Replay/restart handling: replaying the same song or restarting from pause no longer causes the song-start fire-once guard to silently swallow the second start event.
  • gameStage transition edge cases: state transitions through nsp_main → nonstopplayhub → nonstopplaygame now correctly trigger song-start logging.

Arrangement resolution (hotfix 5 series)

  • 5.0 : Path-based resolution introduced in both the C# (Sniffer.cs) and JS (sniffer-poller.js) sides as the primary fallback when arrangementID matching fails.
  • 5.1 : Restored first-match-wins semantics in the Path filter step. An earlier count-and-only-pick-if-one approach left sections and phrases unrendered during song-select for any song with multiple arrangements of the same type. Behavior now matches the legacy resolution semantics that users expect.
  • 5.2 : Fixed the Remastered base address. The pointer was being double-shifted by +0x3080, causing currentPath to read from the wrong memory cell. Now correctly resolves on Remastered.

Nonstop Play history gating

Songs played in Nonstop Play are now excluded from CSV and SQLite playthrough history, and from the per-attempt JSON tracker. Reason: even with Path-based resolution, we cannot reliably distinguish between, say, a regular Bass arrangement and a bonus Bass arrangement, or between Lead and an alt-Lead chart. Writing potentially-wrong arrangement tags into the user's permanent history is worse than not writing. Historic records should be trustworthy or absent. Nonstop sessions still log to sniffer.log, fire Discord RPC events, and update live overlays normally; only the persistent history layer is skipped.

This is expected to remain in place until a Nonstop-compatible arrangementID memory pointer is found.

Warning noise reduction

The "Could not resolve arrangement at song start" warning is now suppressed when the song was started in Nonstop Play. In Nonstop, Path-based fallback is the expected resolution path, not a degradation, so the warning was firing on every Nonstop song. The warning is still emitted in Learn A Song / Score Attack / other modes, where it remains a useful safety signal for transient timing races or genuine bugs.

Removed (Deprecated)

The following items are no longer used as of v0.6.5. None of these are part of the user-facing config or workflow; mention is for completeness in case anyone has forked the addons or scripted around the previous internals.

Item Replaced by
addons/config-ui.js currentPath from memory readout (consumed directly by addons)
addons/_deps/sniffer_state.json (removed; was used to persist lastResolvedPath across sessions)
defaultArrangementType setting currentPath (real-time memory read)
SnifferRuntimeState class (removed; sniffer_state.json no longer written)
Internal lastResolvedPath field (removed)
prevPath / prev-path heuristic (removed from C# fallback chain; prevArrangement retained)

Effect on existing installs

  • An existing sniffer_state.json becomes orphaned and can be deleted manually. RockSniffer will not read or write it.
  • A defaultArrangementType setting in sniffer.json will be ignored. It will be silently stripped on the next config write, which is harmless.
  • Custom addons that imported defaultPath from config-ui.js will throw a ReferenceError. The fix is to read this._prevdata.memoryReadout.currentPath (in poller-style addons) or this.readout.currentPath (in Vue-style addons).

Internal Changes

  • Net code reduction: −173 lines across the Lib (Sniffer.cs shed 76 lines; SnifferSettings.cs shed 11; SnifferRuntimeState.cs removed entirely at 86 lines).
  • Resolution chain in LogSongStartIfPossible simplified from 6 steps to 4: arrangementID → Path filter → single-playable-arrangement heuristic → only-arrangement-on-song heuristic → unresolved.
  • All 13 shipped addon HTMLs had their <script src="../config-ui.js"> line removed.

Known Limitations

  • Nonstop arrangementID resolution is still unsolved. Path resolves the type (Bass / Lead / Rhythm) but cannot disambiguate within a type (regular vs bonus, primary vs alt). Until a Nonstop-compatible arrangementID pointer is identified in memory, Nonstop runs cannot be written to history.
  • Beta and Learn_And_Play Path pointers are unverified. Offsets are back-derived from the consistent edition-shift convention used elsewhere in the memory map. Empirical confirmation welcome.
  • Pause detection occassionally sticks in Score Attack mode; inconsistent and requires further diagnosis.