tag align to OCT release
download pre-compiled application here: https://opencheattables.com/viewtopic.php?f=17&t=1797
Release v560 — Address Finder v3, Property Walker Coverage, UE Version Override
Range: v488 → v560 (41 commits, ~5 weeks of work) Highlights: Reverse-reference scanning, OptionalProperty / MulticastSparseDelegate / Soft+Lazy+Delegate array drill-down, per-game UE version override with publisher bias detection, CE XML / CSX N-level pointer drill-down, UTF-8 hardening + dedicated C++ test suite.
Address Finder
Find References (v2 → v3)
- Reverse pointer scan — given any
UObject*, find every UPROPERTY field across the live object array that holds a pointer to it, so users can navigate from a CE-found instance back to its logical owner. - v2 coverage:
WeakObjectProperty,SoftObjectProperty/SoftClassProperty,LazyObjectProperty,InterfaceProperty,TMap/TSetallocated slots (key + value sides for Object/Class). - v3 coverage:
DelegatePropertysingle binding +MulticastInlineDelegateProperty/MulticastDelegateProperty(walks eachFScriptDelegate'sFWeakObjectPtr);TArray<FScriptDelegate>; nested inStructProperty/OptionalProperty<Struct>to depth 3.fieldNameappends.Key/.Valuefor map matches; deadline 30 s.
Container-aware lookup
- New
Aura::FindInContainersscansArrayProperty/MapProperty/SetPropertybuffers, including nested inStructPropertyandOptionalProperty<Struct>(depth 3). - Slack / freed-slot support, 15 s deadline, response carries
container_scanstats. Aura::FindByAddressreturnsmatch_kind(exact / contains / backward / nearest) for honest confidence reporting.
Property Walker — drill-down coverage
| Inner type | Status |
|---|---|
| SoftObjectProperty / SoftClassProperty array | ✅ Phase G — asset path + resolved live UObject* + per-element FName leaf in CE XML |
| LazyObjectProperty array | ✅ Phase H — FGuid + resolved live UObject* |
| InterfaceProperty array | ✅ Phase I |
| DelegateProperty array (single multicast field also) | ✅ Phase J — Target::FunctionName + drill-into-target |
| MulticastDelegateProperty / MulticastInlineDelegateProperty array | ✅ Phase K — (N bindings) preview |
| OptionalProperty (UE 5.2+) | ✅ Intrusive (UE 5.4+ pointer-shaped), FIntrusiveUnsetOptionalState (Str/Name/Text), and non-intrusive {T value; uint8 bIsSet;} layouts |
| OptionalProperty | ✅ Walker stamps {structClassAddr, structDataAddr, structTypeName}; UI / CE XML / CSX reuse standard StructProperty path |
| MulticastSparseDelegateProperty | ⚠ Bound-flag surfacing only (binding list still pending — see Known Issues) |
| Single Soft / Lazy fields | ✅ Resolve embedded FWeakObjectPtr → UObject* when asset is loaded |
UI / Live Walker UX
- Auto-scroll-to-field after Open from Find Refs.
- Auto-drill into element [N] for direct-container hits (
Container,Container.Key,Container.Value) — previously user had to click[N]manually. - Class Structure: fixed flash-blank on selection; class-like nodes now route to themselves; new Package column; auto-run Find Instances pre-fill.
- Property Search: dedicated type-filter input + autocomplete; client-side result filter; type-only queries supported (e.g. browse all
OptionalPropertyfields). - ProxyDeploy: tooltip flicker fix — anchor above bottom controls.
Export — CE XML / CSX
- N-level ObjectProperty drill-down for Copy CE Field, Copy CE XML, Export CSX. Drill Depth slider (0-4) drives both formats.
- Recursive walk through
ObjectProperty/ClassProperty/WeakObjectProperty/ Soft* /LazyObjectProperty/InterfacePropertytargets, depth-capped, shared visited HashSet for cycle protection. - Cascade struct resolution: nested
StructProperty/OptionalProperty<Struct>children inside drilled UObjects expand to real sub-fields (not emptyGroupHeaderplaceholders). TArray<TSoftObjectPtr>per-element CE XML group with FName leaf.OptionalPropertyCE XML emit: struct-typed → struct group; otherwise → 8 B hex leaf (was silently dropped).- Fix: emit
ObjectProperty/ClassProperty/WeakObjectPropertyas 8 B leaf when not drilled.
UE Version Detection
- Per-game UE version override — new pipe cmd
set_ue_version_override, persisted in HintCache JSON. UI ComboBox in Pointer panel: Auto / 4.18-4.27 / 5.0-5.8. Survives game restarts. - Publisher thumbprint detection — reads PE
LegalCopyright/CompanyName, matches against publisher table (currentlySQUARE_ENIX). Match → forcesbLowConfidence=trueand uses publisher's bias fallback (SquareEnix → 4.27 instead of 5.04). - Tier 3 hardening — bare "X.Y.D" pattern now requires
Engine/Unreal/UE4/UE5/++UEanchor in 256-byte window AND defers first hit so a real Tier 2 "Release-4.27" later in the module beats early stray "5.5.0" SDK strings. Tier 3 hits are flagged low-confidence even when accepted. - 3-state UI badge: ✓ Detected (green) / 🔧 User Override (blue) / ⚠ Low Confidence (amber) + Publisher chip when thumbprint matched.
Affected games: DQ I&II HD-2D, FF7 Rebirth, FF7 Remake, Ghostwire (all UE4 forks previously misdetected as UE 5.5).
Stability / Hardening
- CE XML emit pointer cycle (UWorld → PersistentLevel → OwningWorld back-edges) caused StringBuilder OOM (~2 GB). Fixed via thread-static
_emitPathHashSet pushed/popped onEmitDrilledPointerentry; back-edges emit a flat 8 B hex leaf labeled(cycle elided). Belt-and-bracesMaxEmitPointerDepth=16cap. - UTF-16 surrogate handling in
Serie::GetStringwide path — root cause of recurringinvalid UTF-8 byte at index 1: 0xA0exceptions on UE 5.7 games (e.g. Squad, 240 K objects). Wide path was producing CESU-8 for surrogate range0xD800..0xDFFF; nlohmann::json strict-validates and rejects. Fix: detect surrogate pairs → 4-byte UTF-8; lone surrogates →?. ReadFStringhardening —WC_ERR_INVALID_CHARSstrict flag +Utf8Helpers::Sanitizepost-pass.Utf8Helpersheader-only extraction — Sanitize (Ubel) + EncodeUtf16 (Serie) merged; both call sites share one implementation.- 31-case C++ self-test (
dll/tests/utf8_helpers_test.cpp) — stand-alone executable, no GoogleTest. Covers ASCII, lone continuations (the 0xA0 case), CESU-8 surrogates, overlongs, truncated sequences, surrogate pairs → 4-byte UTF-8, idempotency, EncodeUtf16-output-passes-Sanitize-unchanged invariant. Wired intobuild.ps1 -Target Testbefore C# suite.
Documentation
- New docs/dev-log.md — running milestone log + capability matrix (read first for current status).
- docs/technical-notes.md — Phase B-K array reader and property-layout reference.
- README + spec docs refreshed to reflect build 547+ capabilities.
- Superseded design docs moved to docs/archive/.
Known Issues
MulticastSparseDelegatePropertybindings still unavailable (storage external to field — needs separate AOB; resolved in v577 viaSPARSE_ES2_1, see future release).FieldPathPropertydrill-down (rare).- Find Refs:
TMap/TSetwith weak-like inner sides (currently Object/Class only). - GWorld: Star Wars Jedi untested; Satisfactory fails.
- Other publishers shipping unreliable version strings will need adding to
kPublishers[]inGenau.cpp.
Pull Requests Merged
- #192 — Per-game UE version override + publisher bias + CE XML cycle fix
- #193 — UTF-8 hardening + Utf8Helpers extraction + C++ test target
Full Changelog: https://github.com/bbfox0703/UE5CEDumper/compare/v488...v560
以下是 v488 → v560 的 GitHub Release Notes(英文,符合專案 commit/code 慣例):Release v560 — Address Finder v3, Property Walker Coverage, UE Version Override
Range: v488 → v560 (41 commits, ~5 weeks of work)
Highlights: Reverse-reference scanning, OptionalProperty / MulticastSparseDelegate / Soft+Lazy+Delegate array drill-down, per-game UE version override with publisher bias detection, CE XML / CSX N-level pointer drill-down, UTF-8 hardening + dedicated C++ test suite.
Address Finder
Find References (v2 → v3)
- Reverse pointer scan — given any
UObject*, find every UPROPERTY field across the live object array that holds a pointer to it, so users can navigate from a CE-found instance back to its logical owner. - v2 coverage:
WeakObjectProperty,SoftObjectProperty/SoftClassProperty,LazyObjectProperty,InterfaceProperty,TMap/TSetallocated slots (key + value sides for Object/Class). - v3 coverage:
DelegatePropertysingle binding +MulticastInlineDelegateProperty/MulticastDelegateProperty(walks eachFScriptDelegate'sFWeakObjectPtr);TArray<FScriptDelegate>; nested inStructProperty/OptionalProperty<Struct>to depth 3.fieldNameappends.Key/.Valuefor map matches; deadline 30 s.
Container-aware lookup
- New
Aura::FindInContainersscansArrayProperty/MapProperty/SetPropertybuffers, including nested inStructPropertyandOptionalProperty<Struct>(depth 3). - Slack / freed-slot support, 15 s deadline, response carries
container_scanstats. Aura::FindByAddressreturnsmatch_kind(exact / contains / backward / nearest) for honest confidence reporting.
Property Walker — drill-down coverage
| Inner type | Status |
|---|---|
SoftObjectProperty / SoftClassProperty array
| ✅ Phase G — asset path + resolved live UObject* + per-element FName leaf in CE XML
|
LazyObjectProperty array
| ✅ Phase H — FGuid + resolved live UObject*
|
InterfaceProperty array
| ✅ Phase I |
DelegateProperty array (single multicast field also)
| ✅ Phase J — Target::FunctionName + drill-into-target |
MulticastDelegateProperty / MulticastInlineDelegateProperty array
| ✅ Phase K — (N bindings) preview
|
OptionalProperty<T> (UE 5.2+)
| ✅ Intrusive (UE 5.4+ pointer-shaped), FIntrusiveUnsetOptionalState (Str/Name/Text), and non-intrusive {T value; uint8 bIsSet;} layouts
|
OptionalProperty<Struct>
| ✅ Walker stamps {structClassAddr, structDataAddr, structTypeName}; UI / CE XML / CSX reuse standard StructProperty path
|
MulticastSparseDelegateProperty
| ⚠ Bound-flag surfacing only (binding list still pending — see Known Issues) |
| Single Soft / Lazy fields | ✅ Resolve embedded FWeakObjectPtr → UObject* when asset is loaded
|
UI / Live Walker UX
- Auto-scroll-to-field after Open from Find Refs.
- Auto-drill into element [N] for direct-container hits (
Container,Container.Key,Container.Value) — previously user had to click[N]manually. - Class Structure: fixed flash-blank on selection; class-like nodes now route to themselves; new Package column; auto-run Find Instances pre-fill.
- Property Search: dedicated type-filter input + autocomplete; client-side result filter; type-only queries supported (e.g. browse all
OptionalPropertyfields). - ProxyDeploy: tooltip flicker fix — anchor above bottom controls.
Export — CE XML / CSX
- N-level ObjectProperty drill-down for Copy CE Field, Copy CE XML, Export CSX. Drill Depth slider (0-4) drives both formats.
- Recursive walk through
ObjectProperty/ClassProperty/WeakObjectProperty/ Soft* /LazyObjectProperty/InterfacePropertytargets, depth-capped, shared visited HashSet for cycle protection. - Cascade struct resolution: nested
StructProperty/OptionalProperty<Struct>children inside drilled UObjects expand to real sub-fields (not emptyGroupHeaderplaceholders). TArray<TSoftObjectPtr>per-element CE XML group with FName leaf.OptionalPropertyCE XML emit: struct-typed → struct group; otherwise → 8 B hex leaf (was silently dropped).- Fix: emit
ObjectProperty/ClassProperty/WeakObjectPropertyas 8 B leaf when not drilled.
UE Version Detection
- Per-game UE version override — new pipe cmd
set_ue_version_override, persisted in HintCache JSON. UI ComboBox in Pointer panel: Auto / 4.18-4.27 / 5.0-5.8. Survives game restarts. - Publisher thumbprint detection — reads PE
LegalCopyright/CompanyName, matches against publisher table (currentlySQUARE_ENIX). Match → forcesbLowConfidence=trueand uses publisher's bias fallback (SquareEnix → 4.27 instead of 5.04). - Tier 3 hardening — bare "X.Y.D" pattern now requires
Engine/Unreal/UE4/UE5/++UEanchor in 256-byte window AND defers first hit so a real Tier 2 "Release-4.27" later in the module beats early stray "5.5.0" SDK strings. Tier 3 hits are flagged low-confidence even when accepted. - 3-state UI badge: ✓ Detected (green) / 🔧 User Override (blue) / ⚠ Low Confidence (amber) + Publisher chip when thumbprint matched.
Affected games: DQ I&II HD-2D, FF7 Rebirth, FF7 Remake, Ghostwire (all UE4 forks previously misdetected as UE 5.5).
Stability / Hardening
- CE XML emit pointer cycle (UWorld → PersistentLevel → OwningWorld back-edges) caused StringBuilder OOM (~2 GB). Fixed via thread-static
_emitPathHashSet pushed/popped onEmitDrilledPointerentry; back-edges emit a flat 8 B hex leaf labeled(cycle elided). Belt-and-bracesMaxEmitPointerDepth=16cap. - UTF-16 surrogate handling in
Serie::GetStringwide path — root cause of recurringinvalid UTF-8 byte at index 1: 0xA0exceptions on UE 5.7 games (e.g. Squad, 240 K objects). Wide path was producing CESU-8 for surrogate range0xD800..0xDFFF; nlohmann::json strict-validates and rejects. Fix: detect surrogate pairs → 4-byte UTF-8; lone surrogates →?. ReadFStringhardening —WC_ERR_INVALID_CHARSstrict flag +Utf8Helpers::Sanitizepost-pass.Utf8Helpersheader-only extraction — Sanitize (Ubel) + EncodeUtf16 (Serie) merged; both call sites share one implementation.- 31-case C++ self-test (
dll/tests/utf8_helpers_test.cpp) — stand-alone executable, no GoogleTest. Covers ASCII, lone continuations (the 0xA0 case), CESU-8 surrogates, overlongs, truncated sequences, surrogate pairs → 4-byte UTF-8, idempotency, EncodeUtf16-output-passes-Sanitize-unchanged invariant. Wired intobuild.ps1 -Target Testbefore C# suite.
Documentation
- New [docs/dev-log.md](docs/dev-log.md) — running milestone log + capability matrix (read first for current status).
- [docs/technical-notes.md](docs/technical-notes.md) — Phase B-K array reader and property-layout reference.
- README + spec docs refreshed to reflect build 547+ capabilities.
- Superseded design docs moved to [docs/archive/](docs/archive/).
Known Issues
MulticastSparseDelegatePropertybindings still unavailable (storage external to field — needs separate AOB; resolved in v577 viaSPARSE_ES2_1, see future release).FieldPathPropertydrill-down (rare).- Find Refs:
TMap/TSetwith weak-like inner sides (currently Object/Class only). - GWorld: Star Wars Jedi untested; Satisfactory fails.
- Other publishers shipping unreliable version strings will need adding to
kPublishers[]inGenau.cpp.
Pull Requests Merged
- [#192](#192) — Per-game UE version override + publisher bias + CE XML cycle fix
- [#193](#193) — UTF-8 hardening + Utf8Helpers extraction + C++ test target
Full Changelog: v488...v560