Files
bd2/plugins/CaptureEnvironment/README.md
T
Flechazo f94cfa1cf3 feat: migrate state and complete live systems
- replace the Haskell bridge with transactional SQLite state and validation

- centralize versions and harden resource, capture, and release tooling

- complete active gacha schedules, point exchange, and mail grants

- add equipment refinement, presets, and ordinary formation workflows

- improve client plugins, request timing, and normalized persistence
2026-09-24 22:43:03 +08:00

57 lines
3.0 KiB
Markdown

# BD2 official capture environment plugin
This BepInEx plugin is only for the separately extracted official client selected by the repository-root `versions.json`.
- redirects `Application.persistentDataPath` to `<game>/IsolatedUserData`;
- prefixes game `PlayerPrefs` keys with a namespace derived from the configured client version;
- keeps account/profile/Neo/Intro and the installed GameData working set in
`<game>/IsolatedUserData`; `NetworkManager.GetPachedGameDataPath()` uses the
private `Data/t` directory and refuses a linked GameData path;
- uses `PluginLocalRes.dll` to read the explicitly supplied, reviewed
ServerData/GameData source; SoundData and VideoData are shared static-data
junctions, while the versioned Addressables catalog cache remains private;
player saves and account data are never linked or copied from the primary
client;
- uses the official client archive's own `StreamingAssets/aa` bundle store;
- captures BD2 API request/response bodies without a proxy or TLS certificate;
- captures protobuf requests before encryption and responses after AES decryption;
- writes through a bounded asynchronous queue; queue overflow or any writer
failure creates `INCOMPLETE.txt`, rejects later packets with an error in the
BepInEx log, and prevents a partial capture from looking complete;
- drains the writer queue during normal application shutdown; if the drain
cannot finish within the shutdown safety deadline, the capture is marked
incomplete instead of silently dropping the tail;
- omits Cookie/Authorization headers and URL query strings;
- skips GET/static resources and bodies larger than 16 MiB.
Request and response protobuf records share one correlation ID when the client
provides the request path. Batch responses are captured after each item is
decrypted. JSONL retains the complete path and type; the human-readable log
truncates those two display columns only. Treat a capture containing
`INCOMPLETE.txt` as unusable evidence and repeat it.
The raw body files may still contain private account data. Do not publish the
generated `Capture` directory. This plugin does not redirect the game API and
must not be installed together with `BD2LocalIdentity.dll` in the official
comparison client.
Unity starts writing its default Player log before BepInEx can patch the data
path. Always launch through `tools/python/start-official-capture.ps1`; it supplies an
explicit isolated `-logFile` path and validates static-data junctions. The
launcher requires the official-client directory argument.
Pass them explicitly, for example:
```powershell
.\tools\python\start-official-capture.ps1 `
-GameDir "<official-client-directory>" `
-ResourceRoot "<downloaded-resource-root>"
```
The launcher reads bundle and GameData versions from the repository-root
`versions.json`. `-VersionConfig`, `-BundleVersion`, and `-GameDataVersion`
remain explicit development overrides.
The launcher derives the shared user-data directory for the current Windows
account; `-SharedDataDir` overrides it when the game uses another location.