Add local animation graph read-only debug

Introduce a game-thread-only, read-only diagnostic helper to probe local player animation graph variables and (optionally) numeric cache IDs. Adds F4TLocalAnimationGraphDebug.h/cpp with UpdateLocalPlayerAnimationGraphDebug(...) and wires a call into plugin/src/main.cpp immediately after GetPlayerMovementState. The helper probes curated variable names via CommonLibF4 read-only APIs, logs availability/changes, and includes a disabled-by-default numeric cache ID scan (kEnableLocalPlayerAnimationGraphCacheIdReadOnlyDebug = false) due to a reported crash during testing. Update also adds extensive dev-log documentation (docs/dev-log.md) describing behavior, testing notes, and rollback instructions. Build succeeded; manual F4SE in-game verification remains pending.
This commit is contained in:
2026-06-03 12:40:26 +12:00
parent 1aecccefb7
commit 3d301a436b
4 changed files with 1056 additions and 0 deletions
+219
View File
@@ -2489,6 +2489,225 @@ Next investigation should focus on read-only animation graph variable discovery
---
## 2026-06-03 - Proxy Animation Graph Read-Only Investigation
### Summary
Added a local-player-only, read-only animation graph diagnostic helper to probe
known candidate graph variable names and compare them with existing local
movement, sneak, jump, and weapon state signals.
### Files Changed
- `plugin/include/F4TLocalAnimationGraphDebug.h`
- `plugin/src/F4TLocalAnimationGraphDebug.cpp`
- `plugin/src/main.cpp`
- `docs/dev-log.md`
### Details
- Added `UpdateLocalPlayerAnimationGraphDebug(...)` on the existing game-thread
local polling path, immediately after `GetPlayerMovementState(...)` and
before any transform send decision.
- Added explicit read-only gates:
`kEnableLocalPlayerAnimationGraphReadOnlyDebug = true` and
`kEnableProxyAnimationGraphReadOnlyDebug = false`.
- The helper only inspects the local player. It does not inspect runtime
proxies by default and does not change proxy movement, lifecycle,
neutralization, placed fallback behavior, networking, protocol, server code,
or fake-client tooling.
- Graph access is limited to read-only CommonLibF4 APIs:
`GetAnimationGraphManagerImpl`, `GetGraphVariableCacheSize`,
`GetGraphVariableImplBool`, `GetGraphVariableImplInt`,
`GetGraphVariableImplFloat`, and
`BGSAnimationSystemUtils::IsActiveGraphInTransition`.
- Candidate variables are probed by curated name only. There is no raw cache
walking, no fake enumeration, no graph variable writes, no graph events, no
`NotifyAnimationGraphImpl`, no `PerformAction`, no `InitializeActorInstant`,
and no `ActorState` writes.
- Unavailable candidate reads are logged once per variable/type. Successful
reads are logged when their value changes or when local state / graph metadata
changes.
### Testing
- Ran `xmake build` from `plugin`; it succeeded and linked
`Fallout4Together.dll`.
- Manual Fallout 4 / F4SE testing is still pending:
- Launch through F4SE.
- `coc F4TTestCell01`.
- Toggle local sneak on/off.
- Move/stop and sprint if safe.
- Jump.
- Draw/holster weapon if safe.
- Check `Fallout4Together.log` for `Local animation graph debug` lines.
- Optionally add one fake client to confirm runtime proxies still spawn and
move while proxy graph diagnostics remain disabled.
### Known Issues
- Useful graph variables have not yet been confirmed in-game; log review from
the manual test sequence is required.
- Candidate variable failures will only prove that those names/types were
unavailable through the current read-by-name API, not that the underlying
graph has no equivalent state.
- CommonLibF4 does not expose a safe graph variable name enumeration API here,
so this pass intentionally uses curated read-by-name probes only.
### Rollback Note
- If the helper causes a crash, severe log spam, local control issues,
performance problems, proxy movement/lifecycle regressions, or unexpected
network send behavior, set `kEnableLocalPlayerAnimationGraphReadOnlyDebug`
back to `false` or remove the single helper call from `plugin/src/main.cpp`.
### Next Steps
- Run the manual F4SE test sequence and record which graph candidates are
available, unavailable, or transition with sneak/movement/jump/weapon state.
- If no safe graph reads produce useful values, investigate another read-only
route such as animation graph event observation research or known Fallout 4
graph variable references before planning any write/event milestone.
---
## 2026-06-03 - Animation Graph Cache ID Read-Only Investigation
### Summary
Added a local-player-only numeric animation graph cache ID diagnostic pass that
uses CommonLibF4 read-only virtual getter overloads to probe cache IDs from
`0` through `GetGraphVariableCacheSize() - 1`.
### Files Changed
- `plugin/src/F4TLocalAnimationGraphDebug.cpp`
- `docs/dev-log.md`
### Details
- Added `kEnableLocalPlayerAnimationGraphCacheIdReadOnlyDebug = true` as a
separate gate from the existing local-player read-only debug gate.
- Kept the existing read-by-name candidate probing intact.
- Numeric probing only uses:
`GetGraphVariableImpl(std::uint32_t, bool&)`,
`GetGraphVariableImpl(std::uint32_t, std::int32_t&)`, and
`GetGraphVariableImpl(std::uint32_t, float&)`.
- `GetGraphVariableCacheSize()` is the strict upper bound, so a cache size of
`64` probes only IDs `0` through `63`.
- Tracks per-ID/per-type availability and last value, logs initial readable
values once, and logs later values only when they change.
- Change logs include local movement, sprint, sneak, jump, weapon, speed,
actor stance, and force-sneak context.
- Added compact candidate buckets for sneak bool/int IDs, movement float IDs,
weapon bool/int IDs, jump bool/int IDs, and sprint bool/int IDs.
- Candidate logs intentionally use cautious wording such as candidate IDs and
movement-speed-related hints. No permanent graph variable names are claimed.
- This remains local-player-only. No proxy actor graph reads were added.
- No graph writes, graph events, `NotifyAnimationGraphImpl`, `PerformAction`,
raw memory reads, cache walking, guessed offsets, `ActorState` writes,
networking changes, protocol changes, Python server changes, fake-client
changes, proxy movement changes, proxy lifecycle changes, proxy
neutralization changes, or placed fallback behavior changes were added.
### Testing
- Ran `xmake build` from `plugin`; it succeeded and linked
`Fallout4Together.dll`.
- Linter diagnostics for `plugin/src/F4TLocalAnimationGraphDebug.cpp` reported
no errors.
- Manual Fallout 4 / F4SE testing is still pending:
- Launch through F4SE.
- `coc F4TTestCell01`.
- Confirm startup logs show graph manager availability, cache size, and
readable cache ID summary.
- Toggle local sneak on/off and check for transition logs plus related
numeric cache ID changes.
- Move/stop, sprint if safe, jump, and draw/holster weapon if safe.
- Optionally add one fake client and confirm runtime proxy spawning/movement
still works while proxy graph cache probing remains absent.
### Observations To Record After Manual Testing
- Cache size observed: not yet observed in-game for this milestone.
- Readable bool ID count: not yet observed in-game.
- Readable int ID count: not yet observed in-game.
- Readable float ID count: not yet observed in-game.
- Candidate IDs discovered: none recorded yet; requires manual log review.
### Known Issues
- Runtime usefulness is unknown until the F4SE manual test pass records actual
cache size, readable counts, and candidate IDs.
- If all numeric cache ID reads return unavailable, this path will only confirm
that the safe numeric read API is not useful for the local player in that
state; it does not justify raw memory probing or graph writes.
### Rollback Note
- If the cache ID diagnostic causes a crash, severe log spam, performance
drops, local control issues, proxy movement regressions, network cadence
changes, or unexpected outgoing transform JSON changes, set
`kEnableLocalPlayerAnimationGraphCacheIdReadOnlyDebug` to `false` or revert
this milestone.
### Next Steps
- Run the manual F4SE test sequence and record cache size, readable ID counts,
and any candidate sneak/movement/weapon/jump/sprint IDs from
`Fallout4Together.log`.
---
## 2026-06-03 - Animation Graph Cache ID Investigation Rollback
### Summary
Disabled numeric animation graph cache ID probing by default after a Fallout 4
crash during read-only testing. Safer local animation graph diagnostics remain
enabled.
### Files Changed
- `plugin/src/F4TLocalAnimationGraphDebug.cpp`
- `docs/dev-log.md`
### Details
- Set `kEnableLocalPlayerAnimationGraphCacheIdReadOnlyDebug = false` with a
crash-safety comment above the gate.
- Left numeric cache ID investigation code in place behind the disabled gate for
future manual single-ID experiments.
- No networking, protocol, Python server, fake-client, proxy, or
`main.cpp` changes.
### Animation Graph Cache ID Investigation Result
Numeric cache ID probing through `GetGraphVariableImpl(id, bool/int/float&)` was tested as a read-only investigation path. Fallout 4 crashed during/after the test, while the server and fake client continued running. The numeric cache ID path has been disabled by default.
The existing local animation graph debug helper remains active for safer diagnostics: local state transitions, graph manager availability, graph cache size, graph transition state, and read-by-name candidate probing.
Future graph investigation should avoid full cache scans and instead test one known/suspected variable or ID at a time behind a stricter manual gate.
### Testing
- Ran `xmake build` from `plugin`; build succeeded.
- Manual F4SE retest pending: `coc F4TTestCell01`, toggle sneak, move/jump/weapon,
add one fake client. Expect `Local animation graph debug:` logs without
`Local animation graph cache debug:` lines and no crash.
### Known Issues
- Full-cache numeric ID probing is treated as unsafe until single-ID manual
gates exist.
### Next Steps
- Run the manual F4SE test sequence to confirm no crash and that safer local
animation debug logs still appear.
---
## Entry Template
Use this format for future updates: