From 92287bd8e1978d4b9cb0cd86c5c01e46c3827113 Mon Sep 17 00:00:00 2001 From: Jacob Babor Date: Fri, 26 Jun 2026 23:33:20 -0500 Subject: [PATCH] Add live-tunable GPS solver highway weight --- docs/compaction-handoff.md | 57 +++++-- docs/red4ext-logging-shim.md | 22 ++- docs/traffic-system-debrief.md | 58 +++++-- logs/EdgeWeightGPS_vanilla_ab_2120.log | 51 ++++++ presets/solver_weights/default.bin | 1 + presets/solver_weights/highway-expensive.bin | Bin 0 -> 4 bytes presets/solver_weights/mild.bin | 1 + .../solver_weights/proof-highway-cheap.bin | 1 + presets/solver_weights/strong.bin | 1 + presets/solver_weights/vanilla.bin | Bin 0 -> 4 bytes red4ext/EdgeWeightGPS/src/Main.cpp | 154 ++++++++++++++++-- tools/write_solver_weights.py | 60 +++++++ 12 files changed, 363 insertions(+), 43 deletions(-) create mode 100644 logs/EdgeWeightGPS_vanilla_ab_2120.log create mode 100644 presets/solver_weights/default.bin create mode 100644 presets/solver_weights/highway-expensive.bin create mode 100644 presets/solver_weights/mild.bin create mode 100644 presets/solver_weights/proof-highway-cheap.bin create mode 100644 presets/solver_weights/strong.bin create mode 100644 presets/solver_weights/vanilla.bin create mode 100755 tools/write_solver_weights.py diff --git a/docs/compaction-handoff.md b/docs/compaction-handoff.md index 51c270d..589807b 100644 --- a/docs/compaction-handoff.md +++ b/docs/compaction-handoff.md @@ -2,6 +2,41 @@ Current date/time context: 2026-06-26, local timezone America/Chicago. +## 2026-06-26 Confirmed Solver-Cost Patch + +- We have unequivocally found the player GPS route-cost lever. +- The crashing RED4ext detour on `0x40bb40` has been replaced by an inline + patch at the road-tail block `0x40bb98`. The patch preserves vanilla + `node+0x93` behavior, checks `node+0x88 & 0x4000` for `Highway`, and then + multiplies highway lane cost by a tunable float. +- This inline patch avoids the register-clobber crash from the C++ detour. + Static disassembly showed the optimized caller reusing volatile state after + calling the tiny vanilla multiplier helper. +- The proof build used highway multiplier `0.35` and visibly changed player + map routes. It also caused over-aggressive behavior, including a bad custom + pin hairpin around the city-center roundabout, proving the hook is real but + that `0.35` is too low. +- The vanilla A/B build disabled only the inline multiplier patch and restored + obviously different route choices. User confirmed the custom pin returned to + the straight city-center roundabout route, while the `0.35` build took the + wrong hairpin. +- Current installed build enables the inline patch with default highway + multiplier `0.80` and polls + `red4ext/plugins/EdgeWeightGPS/solver_weights.bin` every 500 ms. The file is + exactly one little-endian float32 highway multiplier. +- The inline patch is deliberately broad across the vanilla road-tail branch: + reaching `0x40bb98` already means vanilla selected road-style modes `0/2/4`, + so we do not hard-gate on `solver+0xc4 == 2`. This avoids creating a manual + drive/autodrive disparity. Pedestrian mode `1` uses a different vanilla + branch and is not changed by this road-tail patch. +- Preset writer: + `tools/write_solver_weights.py`. Preset binaries live in + `presets/solver_weights/`: `vanilla`, `mild`, `default`, `strong`, + `proof-highway-cheap`, and `highway-expensive`. +- Evidence logs: + `logs/EdgeWeightGPS_inline_highway035_changed_routes_1449.log` and + `logs/EdgeWeightGPS_vanilla_ab_2120.log`. + ## 2026-06-26 Static Update - Installed RED4ext state is safe: the game plugin directory contains @@ -110,19 +145,19 @@ Important caveat: - Older DLLs are preserved disabled as: `Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.dll.disabled` and `EdgeWeightGPS.dd1423b.dll.disabled`. -- Source defaults now enable the full async solver multiplier hook: - `kEnableGpsMultiplierHooks = true`. -- The current behavior patch is deliberately narrow and diagnostic: - `DetourGpsNodeMultiplier` hooks native `0x40bb40`, applies only when - `job+0xc4 == 2` (driving route mode), reads lane/node flags from - `node+0x88`, and multiplies vanilla node edge cost by highway `0.35`, - GPSOnly `1.10`, pavement `1.25`, and all other flags `1.0`. -- `0x40bb00` auxiliary/reverse multiplier is hooked only for signature logging; - it is not patched yet. +- Source defaults enable the inline road-tail patch: + `kEnableGpsNodeMultiplierInlinePatch = true`. +- Source defaults do not enable the old full-function detour: + `kEnableGpsMultiplierHooks = false`. +- Current behavior patch is the inline `0x40bb98` code-cave patch. It preserves + vanilla road cost except for highway lanes, whose cost is multiplied by the + current `solver_weights.bin` float. Installed default is `0.80`. +- `solver_weights.bin` lives beside the DLL and is hot-polled every 500 ms. - The plugin log was truncated immediately before installing this build. - Latest archived test log: - `logs/EdgeWeightGPS_spatial_inversion_no_route_change_1845.log`. -- Game is cold as of the latest user message. + `logs/EdgeWeightGPS_vanilla_ab_2120.log`. +- A cold restart is required after installing a new DLL; changing + `solver_weights.bin` after that is hot-reloaded. ## 2026-06-26 Full Async Solver Findings diff --git a/docs/red4ext-logging-shim.md b/docs/red4ext-logging-shim.md index 2ea4af1..676d5dc 100644 --- a/docs/red4ext-logging-shim.md +++ b/docs/red4ext-logging-shim.md @@ -66,12 +66,22 @@ Current behavior: Active build note: -- The currently installed build is disabled on disk: - `EdgeWeightGPS.dll.disabled`. There is no active `EdgeWeightGPS.dll` in the - game plugin directory. -- Source defaults are still read-only for route behavior. They disable provider - class multiplier overrides and the spatial edge-cost patch, while keeping GPS - query lifecycle tracing available for probe builds. +- The currently installed build is active as + `red4ext/plugins/EdgeWeightGPS/EdgeWeightGPS.dll`. +- Source defaults enable the stable inline solver-cost patch at `0x40bb98` + (`kEnableGpsNodeMultiplierInlinePatch = true`) and keep the old full-function + `0x40bb40` C++ detour disabled (`kEnableGpsMultiplierHooks = false`). +- The inline patch preserves vanilla road cost except for highway lanes in the + road-tail branch. Highway lanes are multiplied by the live value in + `solver_weights.bin`, defaulting to `0.80`. +- The patch is intentionally not hard-gated on `solver+0xc4 == 2`; the vanilla + branch already limits it to road-style modes `0/2/4`, which keeps manual + drive and autodrive-like callers from diverging while leaving pedestrian mode + `1` alone. +- `solver_weights.bin` lives beside the DLL and is exactly one little-endian + float32. The plugin polls it every 500 ms from the Running game-state update. + `tools/write_solver_weights.py` writes the installed file or generates preset + binaries under `presets/solver_weights/`. - The async route-job hooks are split behind `kEnableGpsRouteJobLifecycleHooks` and are disabled in the active probe; this keeps the log focused on `0x70a42c` submissions, `0x7094b8` result records, and local diff --git a/docs/traffic-system-debrief.md b/docs/traffic-system-debrief.md index 664f225..ca4efa2 100644 --- a/docs/traffic-system-debrief.md +++ b/docs/traffic-system-debrief.md @@ -980,32 +980,62 @@ the original symptom: the solver is weighted enough to avoid obviously invalid surfaces, but it has no strong reason to stay on highway corridors for long vehicle trips. -The current RED4ext prototype therefore hooks `0x40bb40` and only changes -driving-mode calls (`solver/job + 0xc4 == 2`). It reads flags from -`node+0x88`, leaves vanilla results intact for ordinary roads and unknown -surfaces, and applies this diagnostic multiplier set: +The first RED4ext prototype tried to hook `0x40bb40` as a normal C++ detour. +That found the correct function but crashed during load-time GPS warmup because +the optimized caller expects the tiny vanilla helper not to disturb volatile +register state used immediately afterward. + +The stable prototype now patches inline at the road-tail block `0x40bb98` +instead. Reaching that block already means the vanilla function selected one of +the road-style modes `0/2/4`; pedestrian mode `1` uses a different branch. The +patch preserves vanilla `node+0x93` behavior, checks `node+0x88 & 0x4000`, and +applies an extra multiplier only for highway lanes. + +The proof multiplier was: ```text Highway 0.35 -GPSOnly 1.10 -Pavement 1.25 -Other 1.00 ``` -`0x40bb00` is currently hooked only for signature logging. If the node -multiplier test moves routes but produces weird reverse/turnaround behavior, -the next step is to tune or gate the auxiliary multiplier as well. +Live A/B testing confirmed this is the decisive world-map route-cost lever. +With `0.35`, routes visibly changed and a custom pin around the city-center +roundabout took an obviously bad highway/ramp hairpin. With the inline patch +disabled, the same route returned to the straight vanilla path through the +roundabout. + +The current installed build uses a default highway multiplier of `0.80` and +hot-reloads `solver_weights.bin` from the plugin directory. The file is exactly +one little-endian float32. `tools/write_solver_weights.py` writes the installed +file and can generate named presets: + +```text +vanilla 1.00 +mild 0.90 +default 0.80 +strong 0.70 +proof-highway-cheap 0.35 +highway-expensive 3.00 +``` + +The patch intentionally does not hard-gate on `solver+0xc4 == 2`, because +autodrive-like local vehicle navigation may use another road-style mode. Since +the patch lives in the vanilla road-tail branch, it applies to road-style modes +`0/2/4` and still leaves pedestrian mode `1` alone. + +`0x40bb00` is not patched yet. If tuned highway weights still produce +reverse/turnaround artifacts, inspect or patch that auxiliary multiplier so +reverse/special progress branches receive a compatible policy. ## Future Improvements Better versions of this mod could: -- tune the `0x40bb40` solver multiplier after live A/B testing confirms visible - route changes +- tune the `0x40bb98` inline highway multiplier from the current `0.80` default + using live `solver_weights.bin` presets - inspect and, if needed, patch `0x40bb00` so reverse/special progress branches receive the same road-class policy as forward expansion -- add a tiny live-tuning file for the solver multipliers, similar to the earlier - `spatial_weights.bin`, once the hook is confirmed stable +- extend `solver_weights.bin` beyond one highway float only if GPSOnly/pavement + tuning becomes necessary - replace the crashing `0x8d46cc` detour with a narrower inline patch or a safer caller-side hook - decode enough of the `VAND` graph to join navigation points to traffic lane diff --git a/logs/EdgeWeightGPS_vanilla_ab_2120.log b/logs/EdgeWeightGPS_vanilla_ab_2120.log new file mode 100644 index 0000000..711a4b9 --- /dev/null +++ b/logs/EdgeWeightGPS_vanilla_ab_2120.log @@ -0,0 +1,51 @@ +2026-06-27 05:20:27.000 +0ms EdgeWeightGPS Main reason=Load handle=0x6ffff0440000 sdk=0x7f3ae208 runtime=2.3.1 +2026-06-27 05:20:27.001 +1ms registered Running game-state callbacks +2026-06-27 05:20:27.009 +9ms hook attach GPSQuerySubmit 0x70a42c target=0x14070a42c rva=0x70a42c result=ok original=0x1018c0480 +2026-06-27 05:20:27.018 +18ms hook attach GPSQueryResultFetch 0x7094b8 target=0x1407094b8 rva=0x7094b8 result=ok original=0x1018c04e0 +2026-06-27 05:20:43.172 +16172ms GameState Running OnEnter app=0x31fb80 +2026-06-27 05:20:43.209 +16209ms GameState Running OnUpdate app=0x31fb80 count=0 +2026-06-27 05:20:43.215 +16215ms GameState Running OnUpdate app=0x31fb80 count=1 +2026-06-27 05:20:43.222 +16222ms GameState Running OnUpdate app=0x31fb80 count=2 +2026-06-27 05:20:43.229 +16229ms GameState Running OnUpdate app=0x31fb80 count=3 +2026-06-27 05:20:43.236 +16236ms GameState Running OnUpdate app=0x31fb80 count=4 +2026-06-27 05:21:19.576 +52576ms hook GPSQuerySubmit 0x70a42c call=3 manager=0x1a1d81d30 query=0x799ffa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=1077413892/0x40380804 query_f0c=1/0x1 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3738,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:21:19.576 +52576ms hook GPSQuerySubmit result call=3 queryId=3 manager_nextIdD4=4/0x4 +2026-06-27 05:21:19.577 +52577ms hook GPSQuerySubmit 0x70a42c call=4 manager=0x1a1d81d30 query=0x799ffa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=2052/0x804 query_f0c=0/0x0 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3738,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:21:19.577 +52577ms hook GPSQuerySubmit result call=4 queryId=4 manager_nextIdD4=5/0x5 +2026-06-27 05:21:20.704 +52704ms hook GPSQueryResultFetch 0x7094b8 call=21 queryId=3 tracked=1 perQueryCall=8 value=1 submitCall=3 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x795bfbb0 ret_rva=0x52069c outPath=0x795bfbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb9420100000000000000000000000000000000000000081c33a2010000000000000000000000001f829005000000003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=7176/0x1c08 gpsResult_state42=51 gpsResult_u48=0/0x0 gpsResult_u50=23899283200/0x590821f00 +2026-06-27 05:21:20.704 +52704ms hook GPSQueryResultFetch 0x7094b8 call=22 queryId=3 tracked=1 perQueryCall=9 value=1 submitCall=3 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x795bfbb0 ret_rva=0x520783 outPath=0x795bfbb0 outPath_count=0 outPath_data=0x2e0000002e gpsResult_bytes20=cb000000cb000000a06b8dcd050000002e0000002e0000000000000000000000081c33a2010000000100000001000000001f829005000000983f084301000000 gpsResult_u20=203/0xcb gpsResult_u24=203/0xcb gpsResult_ptr28=0x5cd8d6ba0 gpsResult_vec20_data=0xcb000000cb gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xcb000000cb gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=197568495662/0x2e0000002e gpsResult_u30lo=46/0x2e gpsResult_u34hi=46/0x2e gpsResult_ptr28_capacity30=46 gpsResult_ptr28_count34=46 gpsResult_ptr28_rec40raw=8120b8b1928f77bc0201020000000000000000000200000009506140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010002000000000e0000001700000000000000dcafeb410000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a440615009,3.52051,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x02000102,0,14,23,41ebafdc00000000,0,29.4609,0;4:46427ff3547b0b21,0x00000000,1,23,25,420124203aadc6f0,0.00132581,32.2853,0;5:4f44a1f359ae9b67,0x00030101,0,25,27,41798131397f10bc,0.000243249,15.594,0;6:4f44a1f359ae9b67,0x02020005,0,27,29,417ef14b00000000,0,15.9339,0;7:4634f0f3546f8dc8,0x00000002,0,29,45,433311c900000000,0,179.069,0;8:460f6ff3544f9658,0x04020202,0,45,47,424b279039be0111,0.000362404,50.7886,0;9:464279f3547b00ef,0x00000003,0,47,51,4395eda800000000,0,299.857,0;10:dc35e51ba9166914,0x01020002,0,51,54,41b8c7a000000000,0,23.0975,0;11:5b21ea90943036bd,0x00000003,0,54,57,42682b74395293e7,0.000200823,58.0424,0;12:dc35da1ba9165663,0x00030103,0,57,59,424f54de393600b5,0.000173571,51.8329,0;13:5b21e39094302ad8,0x00000004,0,59,74,4366a1f438ac59b9,8.21831e-05,230.633,0;14:8b9130427f341426,0x00030304,0,74,76,423e265e00000000,0,47.5375,0;15:5b1b5690942acf93,0x00000004,0,76,92,42ea74d338d9be32,0.000103828,117.228,0;16:a88d9c857d49083e,0x02030004,0,92,104,4231f0c500000000,0,44.4851,0;17:5271bc908f429c3b,0x00000004,0,104,106,42aa457c3867ae8f,5.52373e-05,85.1357,0;18:a88d9d857d4909f1,0x03050004,0,106,108,424840003a28f1fd,0.000644475,50.0625,0;19:ffa6984fc3782cce,0x00000005,1,108,110,4169c5c300000000,0,14.6108,0;20:dda97c10537d41d,0x01040009,0,110,112,427400a239244fca,0.0001567,61.0006,0;21:85f43b6a86254467,0x00000008,0,112,116,427fe7cf3e2067bc,0.156646,63.9764,0;22:85f4386a86253f4e,0x00000008,0,116,118,40cbf84700000000,0,6.37406,0;23:85f0b36a86222778,0x00000008,0,118,123,43a2d2f43a1fd934,0.000609773,325.648,0;24:dde14c1053ade5b,0x00040108,0,123,125,429a52c939aea707,0.000333123,77.1617,0;25:5db97b1b99d86a7b,0x0000000a,0,125,127,4295d94c39d9e8c4,0.000415629,74.9244,0;26:dde16c1053ae1c1,0x0003010a,0,127,129,423000b9397639bc,0.000234819,44.0007,0;27:8400cb68d457ee70,0x00000009,0,129,135,4385543e39b83f5a,0.000351424,266.658,0;28:7f6a7e8858b300b3,0x02030109,0,135,137,4223122000000000,0,40.7677,0;29:8400cc68d457f023,0x00000009,0,137,139,41ed790500000000,0,29.6841,0;30:86ecb4885ca0780e,0x02030109,0,139,141,41f318de390a164c,0.00013169,30.3871,0;31:8400da68d45807ed,0x00000009,0,141,143,422ba2f1391c36ba,0.000148977,42.9091,0;32:86ecb9885ca0808d,0x02030109,0,143,145,421ea10738b27df0,8.51116e-05,39.6573,0;33:84045768d45b122b,0x00000009,0,145,147,43205b4238e191bc,0.00010756,160.356,0;34:1d9aea811c5dd71a,0x03020109,0,147,149,41facdd900000000,0,31.3505,0;35:14a33781173357f6,0x00000005,0,149,151,42a3d39600000000,0,81.9133,0;36:1db266811c7188af,0x00020205,0,151,160,41f57f3337cfa022,2.47509e-05,30.6871,0;37:4274deac90c47d21,0x00000003,0,160,166,4314ced600000000,0,148.808,0;38:42674bac90b8f8fc,0x02020303,0,166,178,41fcbf5c38b1ee76,8.48443e-05,31.5934,0;39:426749ac90b8f596,0x00000003,0,178,180,42e25c3c3995521f,0.000284807,113.18,0;40:42715bac90c168b1,0x02020303,0,180,190,41b5e42100000000,0,22.7364,0;41:426accac90bc0a06,0x00000003,0,190,192,41a711873905bc13,0.000127539,20.8836,0;42:4274ddac90c47b6e,0x02020103,0,192,194,4200002c3a0049b5,0.00048938,32.0002,0;43:3a0cb1e7cc68dd9d,0x00000003,0,194,196,42e1c7af394fa31a,0.000198018,112.89,0;44:83a58c7fb0df2223,0x03020203,0,196,198,41d9b4a000000000,0,27.2132,0;45:83af9d7fb0e7938b,0x00000003,0,198,203,42f72a7500000000,0,123.583,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=7176/0x1c08 gpsResult_state42=51 gpsResult_u48=4294967297/0x100000001 gpsResult_u50=23899283200/0x590821f00 +2026-06-27 05:21:20.705 +52705ms hook GPSQueryResultFetch 0x7094b8 call=23 queryId=3 tracked=1 perQueryCall=10 value=1 submitCall=3 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x795bfbb0 ret_rva=0x520783 outPath=0x795bfbb0 outPath_count=0 outPath_data=0x2e gpsResult_bytes20=cb00000000000000a06b8dcd050000002e000000000000000000000000000000081c33a2010000000100000002000000011f829005000000483f084301000000 gpsResult_u20=203/0xcb gpsResult_u24=0/0x0 gpsResult_ptr28=0x5cd8d6ba0 gpsResult_vec20_data=0xcb gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xcb gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=46/0x2e gpsResult_u30lo=46/0x2e gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=46 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=7176/0x1c08 gpsResult_state42=51 gpsResult_u48=8589934593/0x200000001 gpsResult_u50=23899283201/0x590821f01 +2026-06-27 05:21:20.729 +52729ms hook GPSQueryResultFetch 0x7094b8 call=29 queryId=4 tracked=1 perQueryCall=10 value=1 submitCall=4 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x52069c outPath=0x796bfbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb9420100000000000000000000000000000000000000a076a3430100000000000000000000000000000000000000003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=30368/0x76a0 gpsResult_state42=163 gpsResult_u48=0/0x0 gpsResult_u50=0/0x0 +2026-06-27 05:21:20.731 +52731ms hook GPSQueryResultFetch 0x7094b8 call=30 queryId=4 tracked=1 perQueryCall=11 value=1 submitCall=4 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x520783 outPath=0x796bfbb0 outPath_count=0 outPath_data=0x1d0000001d gpsResult_bytes20=d4000000d4000000006558b2050000001d0000001d0000000000000000000000a076a3430100000001000000010000000000000000000000983f084301000000 gpsResult_u20=212/0xd4 gpsResult_u24=212/0xd4 gpsResult_ptr28=0x5b2586500 gpsResult_vec20_data=0xd4000000d4 gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xd4000000d4 gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=124554051613/0x1d0000001d gpsResult_u30lo=29/0x1d gpsResult_u34hi=29/0x1d gpsResult_ptr28_capacity30=29 gpsResult_ptr28_count34=29 gpsResult_ptr28_rec40raw=8120b8b1928f77bc0201020000000000000000000200000009506140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010300000000000e00000019000000000000004d2407420000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a440615009,3.52051,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x00030102,0,14,25,4207244d00000000,0,33.7854,0;4:4612f4f35452ae2e,0x00000004,0,25,27,414c15a400000000,0,12.7553,0;5:2c72e2b25759a141,0x02030104,0,27,29,4200005300000000,0,32.0003,0;6:4f4112f359ab7293,0x00000004,0,29,41,43026f2439bf49c1,0.000364853,130.434,0;7:46386ef3547299b9,0x00020104,0,41,51,4233b78400000000,0,44.9292,0;8:5853c7f35eecbcd5,0x00000002,1,51,54,42d112673928616a,0.00016058,104.536,0;9:46427ef3547b096e,0x02020108,0,54,64,419c78e738fcfac5,0.00012063,19.559,0;10:585040f35ee9a199,0x00000002,1,64,82,42edb546399e3c17,0.000301809,118.854,0;11:58574df35eefd65e,0x00020202,0,82,84,424e963d3826cfaa,3.97709e-05,51.6467,0;12:dc46e41ba924da94,0x00000002,1,84,113,43d6681a00000000,0,428.813,0;13:44aecf6a4a053a22,0x04020205,0,113,115,421cd19c00000000,0,39.2047,0;14:526e3f908f3f91fd,0x00000003,0,115,117,426d5279387ed573,6.07571e-05,59.3305,0;15:198a739cb695e652,0x00020203,0,117,130,42508e7100000000,0,52.1391,0;16:7e9e916a825df5db,0x00000002,1,130,135,42353aee39682c6c,0.000221418,45.3075,0;17:7e9e906a825df428,0x00000002,1,135,148,43345cae39c76877,0.000380341,180.362,0;18:6b629392cdab54bc,0x02020103,0,148,150,420c006f00000000,0,35.0004,0;19:7e9e946a825dfaf4,0x00000002,1,150,155,426e6f2e39198edb,0.000146444,59.6086,0;20:6b629592cdab5822,0x00020303,0,155,157,4207394000000000,0,33.8059,0;21:7e9e976a825e000d,0x00000002,1,157,161,423926183a44500e,0.000748874,46.2872,0;22:6b629492cdab566f,0x01020203,0,161,163,4233ffb500000000,0,44.9997,0;23:7e9e966a825dfe5a,0x00000002,1,163,170,42ff5c4800000000,0,127.68,0;24:6b629692cdab59d5,0x00020303,0,170,173,42494ce238b48c61,8.60922e-05,50.3251,0;25:7e9b126a825ae837,0x00000002,1,173,190,434fcf833856ec39,5.12416e-05,207.811,0;26:6b409192cd8e6af0,0x01020003,0,190,199,42828c7600000000,0,65.2743,0;27:76766688538bbec7,0x00000002,1,199,210,442df92638532584,5.03413e-05,695.893,0;28:15a96b64f46d74f1,0x00000002,1,210,212,42c4fe27391c074f,0.0001488,98.4964,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=30368/0x76a0 gpsResult_state42=163 gpsResult_u48=4294967297/0x100000001 gpsResult_u50=0/0x0 +2026-06-27 05:21:20.731 +52731ms hook GPSQueryResultFetch 0x7094b8 call=31 queryId=4 tracked=1 perQueryCall=12 value=1 submitCall=4 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x520783 outPath=0x796bfbb0 outPath_count=0 outPath_data=0x1d gpsResult_bytes20=d400000000000000006558b2050000001d000000000000000000000000000000a076a3430100000001000000020000000100000000000000483f084301000000 gpsResult_u20=212/0xd4 gpsResult_u24=0/0x0 gpsResult_ptr28=0x5b2586500 gpsResult_vec20_data=0xd4 gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xd4 gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=29/0x1d gpsResult_u30lo=29/0x1d gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=29 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=30368/0x76a0 gpsResult_state42=163 gpsResult_u48=8589934593/0x200000001 gpsResult_u50=1/0x1 +2026-06-27 05:21:42.748 +74748ms hook GPSQuerySubmit 0x70a42c call=27 manager=0x1a1d81d30 query=0x79d3fa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=1082787844/0x408a0804 query_f0c=1/0x1 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3722,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:21:42.748 +74748ms hook GPSQuerySubmit result call=27 queryId=27 manager_nextIdD4=28/0x1c +2026-06-27 05:21:42.828 +74828ms hook GPSQueryResultFetch 0x7094b8 call=4660 queryId=27 tracked=1 perQueryCall=7 value=1 submitCall=27 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x52069c outPath=0x796bfbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb942010000000000000000000000000000000000000098ee7cad010000000028144000000000007b0a8001000000003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=61080/0xee98 gpsResult_state42=124 gpsResult_u48=1075062784/0x40142800 gpsResult_u50=6443137792/0x1800a7b00 +2026-06-27 05:21:42.830 +74830ms hook GPSQueryResultFetch 0x7094b8 call=4661 queryId=27 tracked=1 perQueryCall=8 value=1 submitCall=27 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x520783 outPath=0x796bfbb0 outPath_count=0 outPath_data=0x2200000022 gpsResult_bytes20=a9000000a9000000308105be050000002200000022000000000000000000000098ee7cad010000000128144001000000007b0a8001000000983f084301000000 gpsResult_u20=169/0xa9 gpsResult_u24=169/0xa9 gpsResult_ptr28=0x5be058130 gpsResult_vec20_data=0xa9000000a9 gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xa9000000a9 gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=146028888098/0x2200000022 gpsResult_u30lo=34/0x22 gpsResult_u34hi=34/0x22 gpsResult_ptr28_capacity30=34 gpsResult_ptr28_count34=34 gpsResult_ptr28_rec40raw=8120b8b1928f77bc02010200000000000000000002000000cd586140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010002000000000e0000001700000000000000dcafeb410000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a4406158cd,3.52104,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x02000102,0,14,23,41ebafdc00000000,0,29.4609,0;4:46427ff3547b0b21,0x00000000,1,23,25,420124203aadc6f0,0.00132581,32.2853,0;5:4f44a1f359ae9b67,0x00030101,0,25,27,41798131397f10bc,0.000243249,15.594,0;6:4f44a1f359ae9b67,0x02020005,0,27,29,417ef14b00000000,0,15.9339,0;7:4634f0f3546f8dc8,0x00000002,0,29,45,433311c900000000,0,179.069,0;8:460f6ff3544f9658,0x04020202,0,45,47,424b279039be0111,0.000362404,50.7886,0;9:464279f3547b00ef,0x00000003,0,47,51,4395eda800000000,0,299.857,0;10:dc35e51ba9166914,0x01020002,0,51,54,41b8c7a000000000,0,23.0975,0;11:5b21ea90943036bd,0x00000003,0,54,57,42682b74395293e7,0.000200823,58.0424,0;12:dc35da1ba9165663,0x00030103,0,57,59,424f54de393600b5,0.000173571,51.8329,0;13:5b21e39094302ad8,0x00000004,0,59,74,4366a1f438ac59b9,8.21831e-05,230.633,0;14:8b9130427f341426,0x00030304,0,74,76,423e265e00000000,0,47.5375,0;15:5b1b5690942acf93,0x00000004,0,76,92,42ea74d338d9be32,0.000103828,117.228,0;16:a88d9c857d49083e,0x02030004,0,92,104,4231f0c500000000,0,44.4851,0;17:5271bc908f429c3b,0x00000004,0,104,106,42aa457c3867ae8f,5.52373e-05,85.1357,0;18:a88d9d857d4909f1,0x03030004,0,106,108,424e28183a13406f,0.000561721,51.5392,0;19:ffa6984fc3782cce,0x00000003,1,108,110,416bc10300000000,0,14.7346,0;20:dda97c10537d41d,0x0102000b,0,110,112,427400a23a3dab78,0.000723533,61.0006,0;21:85f43b6a86254467,0x0000000a,0,112,116,42803a673eeff29c,0.468648,64.1141,0;22:85f4386a86253f4e,0x0000000a,0,116,118,40cbfbef00000000,0,6.3745,0;23:85f0b36a86222778,0x0000000a,0,118,123,43a2d3de3aaea2d4,0.00133237,325.655,0;24:dde14c1053ade5b,0x0003010a,0,123,125,4299ffb139cfad24,0.000396111,76.9994,0;25:5db97b1b99d86a7b,0x0000000b,0,125,127,4295d97c3a44a632,0.000750157,74.9248,0;26:dde16c1053ae1c1,0x0002010b,0,127,129,423000ac397639c8,0.000234819,44.0007,0;27:8400cb68d457ee70,0x0000000a,0,129,135,438560a937945cbd,1.76862e-05,266.755,0;28:7f6a7e8858b300b3,0x0002010a,0,135,145,41e854e100000000,0,29.0414,0;29:7f6a8b8858b316ca,0x00000002,1,145,147,430929e439b23736,0.000339919,137.164,0;30:7f90028858d2fd3c,0x00020303,0,147,156,420aa5b000000000,0,34.6618,0;31:767d53885391bd2c,0x00000003,0,156,158,41fd9ee9389608f8,7.15423e-05,31.7026,0;32:e1757f45b301d064,0x00020102,0,158,167,41ec76ec,29.5581,0,0;33:d4e1d9dbfbc5c18,0x00000002,1,167,169,429cf29243168f79,150.56,78.4738,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=61080/0xee98 gpsResult_state42=124 gpsResult_u48=5370030081/0x140142801 gpsResult_u50=6443137792/0x1800a7b00 +2026-06-27 05:21:42.830 +74830ms hook GPSQueryResultFetch 0x7094b8 call=4662 queryId=27 tracked=1 perQueryCall=9 value=1 submitCall=27 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x520783 outPath=0x796bfbb0 outPath_count=0 outPath_data=0x22 gpsResult_bytes20=a900000000000000308105be050000002200000000000000000000000000000098ee7cad010000000128144002000000017b0a8001000000483f084301000000 gpsResult_u20=169/0xa9 gpsResult_u24=0/0x0 gpsResult_ptr28=0x5be058130 gpsResult_vec20_data=0xa9 gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xa9 gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=34/0x22 gpsResult_u30lo=34/0x22 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=34 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=61080/0xee98 gpsResult_state42=124 gpsResult_u48=9664997377/0x240142801 gpsResult_u50=6443137793/0x1800a7b01 +2026-06-27 05:21:48.797 +80797ms hook GPSQuerySubmit 0x70a42c call=34 manager=0x1a1d81d30 query=0x796bfa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=1082787844/0x408a0804 query_f0c=1/0x1 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3722,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:21:48.797 +80797ms hook GPSQuerySubmit result call=34 queryId=34 manager_nextIdD4=35/0x23 +2026-06-27 05:21:48.861 +80861ms hook GPSQueryResultFetch 0x7094b8 call=5323 queryId=34 tracked=1 perQueryCall=6 value=1 submitCall=34 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79e3fbb0 ret_rva=0x52069c outPath=0x79e3fbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb9420100000000000000000000000000000000000000b0a1ae9c0100000000000000000000000001000000000000003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=41392/0xa1b0 gpsResult_state42=174 gpsResult_u48=0/0x0 gpsResult_u50=256/0x100 +2026-06-27 05:21:48.867 +80867ms hook GPSQueryResultFetch 0x7094b8 call=5324 queryId=34 tracked=1 perQueryCall=7 value=1 submitCall=34 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79e3fbb0 ret_rva=0x520783 outPath=0x79e3fbb0 outPath_count=0 outPath_data=0x2700000027 gpsResult_bytes20=be000000be00000080f80c970500000027000000270000000000000000000000b0a1ae9c0100000001000000010000000001000000000000983f084301000000 gpsResult_u20=190/0xbe gpsResult_u24=190/0xbe gpsResult_ptr28=0x5970cf880 gpsResult_vec20_data=0xbe000000be gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xbe000000be gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=167503724583/0x2700000027 gpsResult_u30lo=39/0x27 gpsResult_u34hi=39/0x27 gpsResult_ptr28_capacity30=39 gpsResult_ptr28_count34=39 gpsResult_ptr28_rec40raw=8120b8b1928f77bc02010200000000000000000002000000a7556140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010002000000000e0000001700000000000000dcafeb410000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a4406155a7,3.52085,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x02000102,0,14,23,41ebafdc00000000,0,29.4609,0;4:46427ff3547b0b21,0x00000000,1,23,25,420124203aadc6f0,0.00132581,32.2853,0;5:4f44a1f359ae9b67,0x00030101,0,25,27,41798131397f10bc,0.000243249,15.594,0;6:4f44a1f359ae9b67,0x02020005,0,27,29,417ef14b00000000,0,15.9339,0;7:4634f0f3546f8dc8,0x00000002,0,29,45,433311c900000000,0,179.069,0;8:460f6ff3544f9658,0x04020202,0,45,47,424b279039be0111,0.000362404,50.7886,0;9:464279f3547b00ef,0x00000003,0,47,51,4395eda800000000,0,299.857,0;10:dc35e51ba9166914,0x01020002,0,51,54,41b8c7a000000000,0,23.0975,0;11:5b21ea90943036bd,0x00000003,0,54,57,42682b74395293e7,0.000200823,58.0424,0;12:dc35da1ba9165663,0x00030103,0,57,59,424f54de393600b5,0.000173571,51.8329,0;13:5b21e39094302ad8,0x00000004,0,59,74,4366a1f438ac59b9,8.21831e-05,230.633,0;14:8b9130427f341426,0x00030304,0,74,76,423e265e00000000,0,47.5375,0;15:5b1b5690942acf93,0x00000004,0,76,92,42ea74d338d9be32,0.000103828,117.228,0;16:a88d9c857d49083e,0x02030004,0,92,104,4231f0c500000000,0,44.4851,0;17:5271bc908f429c3b,0x00000004,0,104,106,42aa457c3867ae8f,5.52373e-05,85.1357,0;18:a88d9d857d4909f1,0x03050004,0,106,108,424840003a28f1fd,0.000644475,50.0625,0;19:ffa6984fc3782cce,0x00000005,1,108,110,4169c5c300000000,0,14.6108,0;20:dda97c10537d41d,0x01040009,0,110,112,427400a239244fca,0.0001567,61.0006,0;21:85f43b6a86254467,0x00000008,0,112,116,427fe7cf3e2067bc,0.156646,63.9764,0;22:85f4386a86253f4e,0x00000008,0,116,118,40cbf84700000000,0,6.37406,0;23:85f0b36a86222778,0x00000008,0,118,123,43a2d2f43a1fd934,0.000609773,325.648,0;24:dde14c1053ade5b,0x00040108,0,123,125,429a52c900000000,0,77.1617,0;25:5db97b1b99d86a7b,0x0000000a,0,125,127,4295d94c39d9e8c4,0.000415629,74.9244,0;26:dde16c1053ae1c1,0x0003010a,0,127,129,423000b9397639bc,0.000234819,44.0007,0;27:8400cb68d457ee70,0x00000009,0,129,135,4385543e39b83f5a,0.000351424,266.658,0;28:7f6a7e8858b300b3,0x02030109,0,135,137,4223122000000000,0,40.7677,0;29:8400cc68d457f023,0x00000009,0,137,139,41ed790500000000,0,29.6841,0;30:86ecb4885ca0780e,0x02030109,0,139,141,41f318de390a164c,0.00013169,30.3871,0;31:8400da68d45807ed,0x00000009,0,141,143,422ba2f1391c36ba,0.000148977,42.9091,0;32:86ecb9885ca0808d,0x02030109,0,143,145,421ea10738b27df0,8.51116e-05,39.6573,0;33:84045768d45b122b,0x00000009,0,145,147,43205b4238e191bc,0.00010756,160.356,0;34:1d9aea811c5dd71a,0x03020109,0,147,149,41facdd900000000,0,31.3505,0;35:14a33781173357f6,0x00000005,0,149,151,42a3d39600000000,0,81.9133,0;36:1db266811c7188af,0x00020205,0,151,160,41f57f3337cfa022,2.47509e-05,30.6871,0;37:4274deac90c47d21,0x00000003,0,160,166,42e597c700000000,0,114.796,0;38:3c25141b1b4f12dc,0x00000000,0,166,190,427a926f00000000,0,62.643,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=41392/0xa1b0 gpsResult_state42=174 gpsResult_u48=4294967297/0x100000001 gpsResult_u50=256/0x100 +2026-06-27 05:21:48.867 +80867ms hook GPSQueryResultFetch 0x7094b8 call=5325 queryId=34 tracked=1 perQueryCall=8 value=1 submitCall=34 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79e3fbb0 ret_rva=0x520783 outPath=0x79e3fbb0 outPath_count=0 outPath_data=0x27 gpsResult_bytes20=be0000000000000080f80c970500000027000000000000000000000000000000b0a1ae9c0100000001000000020000000101000000000000483f084301000000 gpsResult_u20=190/0xbe gpsResult_u24=0/0x0 gpsResult_ptr28=0x5970cf880 gpsResult_vec20_data=0xbe gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xbe gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=39/0x27 gpsResult_u30lo=39/0x27 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=39 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=41392/0xa1b0 gpsResult_state42=174 gpsResult_u48=8589934593/0x200000001 gpsResult_u50=257/0x101 +2026-06-27 05:21:53.041 +86041ms hook GPSQuerySubmit 0x70a42c call=40 manager=0x1a1d81d30 query=0x796bfa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=1082787844/0x408a0804 query_f0c=1/0x1 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3722,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:21:53.044 +86044ms hook GPSQuerySubmit result call=40 queryId=40 manager_nextIdD4=41/0x29 +2026-06-27 05:21:53.125 +86125ms hook GPSQueryResultFetch 0x7094b8 call=5906 queryId=40 tracked=1 perQueryCall=8 value=1 submitCall=40 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79bffbb0 ret_rva=0x52069c outPath=0x79bffbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb942010000000000000000000000000000000000000090bb99b00100000000000000000000000001000000000000003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=48016/0xbb90 gpsResult_state42=153 gpsResult_u48=0/0x0 gpsResult_u50=256/0x100 +2026-06-27 05:21:53.127 +86127ms hook GPSQueryResultFetch 0x7094b8 call=5907 queryId=40 tracked=1 perQueryCall=9 value=1 submitCall=40 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79bffbb0 ret_rva=0x520783 outPath=0x79bffbb0 outPath_count=0 outPath_data=0x2e0000002e gpsResult_bytes20=cb000000cb000000203bafba050000002e0000002e000000000000000000000090bb99b00100000001000000010000000001000000000000983f084301000000 gpsResult_u20=203/0xcb gpsResult_u24=203/0xcb gpsResult_ptr28=0x5baaf3b20 gpsResult_vec20_data=0xcb000000cb gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xcb000000cb gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=197568495662/0x2e0000002e gpsResult_u30lo=46/0x2e gpsResult_u34hi=46/0x2e gpsResult_ptr28_capacity30=46 gpsResult_ptr28_count34=46 gpsResult_ptr28_rec40raw=8120b8b1928f77bc02010200000000000000000002000000a7556140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010002000000000e0000001700000000000000dcafeb410000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a4406155a7,3.52085,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x02000102,0,14,23,41ebafdc00000000,0,29.4609,0;4:46427ff3547b0b21,0x00000000,1,23,25,420124203aadc6f0,0.00132581,32.2853,0;5:4f44a1f359ae9b67,0x00030101,0,25,27,41798131397f10bc,0.000243249,15.594,0;6:4f44a1f359ae9b67,0x02020005,0,27,29,417ef14b00000000,0,15.9339,0;7:4634f0f3546f8dc8,0x00000002,0,29,45,433311c900000000,0,179.069,0;8:460f6ff3544f9658,0x04020202,0,45,47,424b279039be0111,0.000362404,50.7886,0;9:464279f3547b00ef,0x00000003,0,47,51,4395eda800000000,0,299.857,0;10:dc35e51ba9166914,0x01020002,0,51,54,41b8c7a000000000,0,23.0975,0;11:5b21ea90943036bd,0x00000003,0,54,57,42682b74395293e7,0.000200823,58.0424,0;12:dc35da1ba9165663,0x00030103,0,57,59,424f54de393600b5,0.000173571,51.8329,0;13:5b21e39094302ad8,0x00000004,0,59,74,4366a1f438ac59b9,8.21831e-05,230.633,0;14:8b9130427f341426,0x00030304,0,74,76,423e265e00000000,0,47.5375,0;15:5b1b5690942acf93,0x00000004,0,76,92,42ea74d338d9be32,0.000103828,117.228,0;16:a88d9c857d49083e,0x02030004,0,92,104,4231f0c500000000,0,44.4851,0;17:5271bc908f429c3b,0x00000004,0,104,106,42aa457c3867ae8f,5.52373e-05,85.1357,0;18:a88d9d857d4909f1,0x03050004,0,106,108,424840003a28f1fd,0.000644475,50.0625,0;19:ffa6984fc3782cce,0x00000005,1,108,110,4169c5c300000000,0,14.6108,0;20:dda97c10537d41d,0x01040009,0,110,112,427400a239244fca,0.0001567,61.0006,0;21:85f43b6a86254467,0x00000008,0,112,116,427fe7cf3e2067bc,0.156646,63.9764,0;22:85f4386a86253f4e,0x00000008,0,116,118,40cbf84700000000,0,6.37406,0;23:85f0b36a86222778,0x00000008,0,118,123,43a2d2f43a1fd934,0.000609773,325.648,0;24:dde14c1053ade5b,0x00040108,0,123,125,429a52c939aea707,0.000333123,77.1617,0;25:5db97b1b99d86a7b,0x0000000a,0,125,127,4295d94c39d9e8c4,0.000415629,74.9244,0;26:dde16c1053ae1c1,0x0003010a,0,127,129,423000b9397639bc,0.000234819,44.0007,0;27:8400cb68d457ee70,0x00000009,0,129,135,4385543e399c6df9,0.000298366,266.658,0;28:7f6a7e8858b300b3,0x02030109,0,135,137,4223122000000000,0,40.7677,0;29:8400cc68d457f023,0x00000009,0,137,139,41ed790500000000,0,29.6841,0;30:86ecb4885ca0780e,0x02030109,0,139,141,41f318de390a164c,0.00013169,30.3871,0;31:8400da68d45807ed,0x00000009,0,141,143,422ba2f100000000,0,42.9091,0;32:86ecb9885ca0808d,0x02030109,0,143,145,421ea10738b27df0,8.51116e-05,39.6573,0;33:84045768d45b122b,0x00000009,0,145,147,43205b4238e191bc,0.00010756,160.356,0;34:1d9aea811c5dd71a,0x03020109,0,147,149,41facdd900000000,0,31.3505,0;35:14a33781173357f6,0x00000005,0,149,151,42a3d39600000000,0,81.9133,0;36:1db266811c7188af,0x00020205,0,151,160,41f57f3337cfa022,2.47509e-05,30.6871,0;37:4274deac90c47d21,0x00000003,0,160,166,4314ced600000000,0,148.808,0;38:42674bac90b8f8fc,0x02020303,0,166,178,41fcbf5c38b1ee76,8.48443e-05,31.5934,0;39:426749ac90b8f596,0x00000003,0,178,180,42e25c3c3995521f,0.000284807,113.18,0;40:42715bac90c168b1,0x02020303,0,180,190,41b5e42100000000,0,22.7364,0;41:426accac90bc0a06,0x00000003,0,190,192,41a711873905bc13,0.000127539,20.8836,0;42:4274ddac90c47b6e,0x02020103,0,192,194,4200002c3a0049b5,0.00048938,32.0002,0;43:3a0cb1e7cc68dd9d,0x00000003,0,194,196,42e1c7af394fa31a,0.000198018,112.89,0;44:83a58c7fb0df2223,0x03020203,0,196,198,41d9b4a000000000,0,27.2132,0;45:83af9d7fb0e7938b,0x00000003,0,198,203,42f72a7500000000,0,123.583,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=48016/0xbb90 gpsResult_state42=153 gpsResult_u48=4294967297/0x100000001 gpsResult_u50=256/0x100 +2026-06-27 05:21:53.128 +86128ms hook GPSQueryResultFetch 0x7094b8 call=5908 queryId=40 tracked=1 perQueryCall=10 value=1 submitCall=40 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79bffbb0 ret_rva=0x520783 outPath=0x79bffbb0 outPath_count=0 outPath_data=0x2e gpsResult_bytes20=cb00000000000000203bafba050000002e00000000000000000000000000000090bb99b00100000001000000020000000101000000000000483f084301000000 gpsResult_u20=203/0xcb gpsResult_u24=0/0x0 gpsResult_ptr28=0x5baaf3b20 gpsResult_vec20_data=0xcb gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xcb gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=46/0x2e gpsResult_u30lo=46/0x2e gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=46 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=48016/0xbb90 gpsResult_state42=153 gpsResult_u48=8589934593/0x200000001 gpsResult_u50=257/0x101 +2026-06-27 05:21:59.806 +91806ms hook GPSQuerySubmit 0x70a42c call=47 manager=0x1a1d81d30 query=0x796bfa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=2908227588/0xad580804 query_f0c=1/0x1 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3722,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:21:59.806 +91806ms hook GPSQuerySubmit result call=47 queryId=47 manager_nextIdD4=48/0x30 +2026-06-27 05:21:59.846 +91846ms hook GPSQueryResultFetch 0x7094b8 call=6559 queryId=47 tracked=1 perQueryCall=4 value=1 submitCall=47 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x795bfbb0 ret_rva=0x52069c outPath=0x795bfbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb9420100000000000000000000000000000000000000000000000000000000ffffff0000000000000000ffffffff003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=0/0x0 gpsResult_state42=0 gpsResult_u48=4294967040/0xffffff00 gpsResult_u50=18446744069414584320/0xffffffff00000000 +2026-06-27 05:21:59.847 +91847ms hook GPSQueryResultFetch 0x7094b8 call=6560 queryId=47 tracked=1 perQueryCall=5 value=1 submitCall=47 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x795bfbb0 ret_rva=0x520783 outPath=0x795bfbb0 outPath_count=0 outPath_data=0x1e0000001e gpsResult_bytes20=d4000000d4000000605d95c7050000001e0000001e0000000000000000000000000000000000000001ffffff0100000000000000ffffffff983f084301000000 gpsResult_u20=212/0xd4 gpsResult_u24=212/0xd4 gpsResult_ptr28=0x5c7955d60 gpsResult_vec20_data=0xd4000000d4 gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xd4000000d4 gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=128849018910/0x1e0000001e gpsResult_u30lo=30/0x1e gpsResult_u34hi=30/0x1e gpsResult_ptr28_capacity30=30 gpsResult_ptr28_count34=30 gpsResult_ptr28_rec40raw=8120b8b1928f77bc02010200000000000000000002000000a7556140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010300000000000e00000019000000000000004d2407420000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a4406155a7,3.52085,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x00030102,0,14,25,4207244d00000000,0,33.7854,0;4:4612f4f35452ae2e,0x00000004,0,25,27,414c15a400000000,0,12.7553,0;5:2c72e2b25759a141,0x02030104,0,27,29,4200005300000000,0,32.0003,0;6:4f4112f359ab7293,0x00000004,0,29,41,43026f2439bf49c1,0.000364853,130.434,0;7:46386ef3547299b9,0x00020104,0,41,51,4233b78400000000,0,44.9292,0;8:5853c7f35eecbcd5,0x00000002,1,51,54,42d112673928616a,0.00016058,104.536,0;9:46427ef3547b096e,0x02020108,0,54,64,419c78e738fcfac5,0.00012063,19.559,0;10:585040f35ee9a199,0x00000002,1,64,82,42edb546399e3c17,0.000301809,118.854,0;11:58574df35eefd65e,0x00020202,0,82,84,424e963d3826cfaa,3.97709e-05,51.6467,0;12:dc46e41ba924da94,0x00000002,1,84,113,43d6681a00000000,0,428.813,0;13:44aecf6a4a053a22,0x04020205,0,113,115,421cd19c00000000,0,39.2047,0;14:526e3f908f3f91fd,0x00000003,0,115,117,426d5279387ed573,6.07571e-05,59.3305,0;15:198a739cb695e652,0x00020203,0,117,130,42508e7100000000,0,52.1391,0;16:7e9e916a825df5db,0x00000002,1,130,135,42353aee39682c6c,0.000221418,45.3075,0;17:7e9e906a825df428,0x00000002,1,135,148,43345cae39c76877,0.000380341,180.362,0;18:6b629392cdab54bc,0x02020103,0,148,150,420c006f00000000,0,35.0004,0;19:7e9e946a825dfaf4,0x00000002,1,150,155,426e6f2e39198edb,0.000146444,59.6086,0;20:6b629592cdab5822,0x00020303,0,155,157,4207394000000000,0,33.8059,0;21:7e9e976a825e000d,0x00000002,1,157,161,423926183a44500e,0.000748874,46.2872,0;22:6b629492cdab566f,0x01020203,0,161,163,4233ffb500000000,0,44.9997,0;23:7e9e966a825dfe5a,0x00000002,1,163,170,42ff5c4800000000,0,127.68,0;24:6b629692cdab59d5,0x00020303,0,170,173,42494ce238b48c61,8.60922e-05,50.3251,0;25:7e9b126a825ae837,0x00000002,1,173,190,434fcf833856ec39,5.12416e-05,207.811,0;26:6b409192cd8e6af0,0x01030003,0,190,197,427e51d800000000,0,63.5799,0;27:76766688538bbec7,0x00000003,1,197,208,442dbcd300000000,0,694.95,0;28:15a96b64f46d74f1,0x00000003,1,208,210,42c4b6a8397a14d0,0.000238496,98.3568,0;29:dee961a1ae096b36,0x01030007,0,210,212,4192b9ee00000000,0,18.3408,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=0/0x0 gpsResult_state42=0 gpsResult_u48=8589934337/0x1ffffff01 gpsResult_u50=18446744069414584320/0xffffffff00000000 +2026-06-27 05:21:59.847 +91847ms hook GPSQueryResultFetch 0x7094b8 call=6561 queryId=47 tracked=1 perQueryCall=6 value=1 submitCall=47 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x795bfbb0 ret_rva=0x520783 outPath=0x795bfbb0 outPath_count=0 outPath_data=0x1e gpsResult_bytes20=d400000000000000605d95c7050000001e000000000000000000000000000000000000000000000001ffffff0200000001000000ffffffff483f084301000000 gpsResult_u20=212/0xd4 gpsResult_u24=0/0x0 gpsResult_ptr28=0x5c7955d60 gpsResult_vec20_data=0xd4 gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xd4 gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=30/0x1e gpsResult_u30lo=30/0x1e gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=30 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=0/0x0 gpsResult_state42=0 gpsResult_u48=12884901633/0x2ffffff01 gpsResult_u50=18446744069414584321/0xffffffff00000001 +2026-06-27 05:22:46.667 +138667ms hook GPSQuerySubmit 0x70a42c call=95 manager=0x1a1d81d30 query=0x797ffa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=2052/0x804 query_f0c=1065353216/0x3f800000 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3722,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:22:46.667 +138667ms hook GPSQuerySubmit result call=95 queryId=95 manager_nextIdD4=96/0x60 +2026-06-27 05:22:46.729 +138729ms hook GPSQueryResultFetch 0x7094b8 call=16547 queryId=95 tracked=1 perQueryCall=6 value=1 submitCall=95 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79d3fbb0 ret_rva=0x52069c outPath=0x79d3fbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb9420100000000000000000000000000000000000000a076a34301000000000000000000000000d74901c03d0ff7003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=30368/0x76a0 gpsResult_state42=163 gpsResult_u48=0/0x0 gpsResult_u50=17802515746883491584/0xf70f3dc00149d700 +2026-06-27 05:22:46.731 +138731ms hook GPSQueryResultFetch 0x7094b8 call=16548 queryId=95 tracked=1 perQueryCall=7 value=1 submitCall=95 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79d3fbb0 ret_rva=0x520783 outPath=0x79d3fbb0 outPath_count=0 outPath_data=0x2700000027 gpsResult_bytes20=be000000be000000304de6bb0500000027000000270000000000000000000000a076a34301000000010000000100000000d74901c03d0ff7983f084301000000 gpsResult_u20=190/0xbe gpsResult_u24=190/0xbe gpsResult_ptr28=0x5bbe64d30 gpsResult_vec20_data=0xbe000000be gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0xbe000000be gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=167503724583/0x2700000027 gpsResult_u30lo=39/0x27 gpsResult_u34hi=39/0x27 gpsResult_ptr28_capacity30=39 gpsResult_ptr28_count34=39 gpsResult_ptr28_rec40raw=8120b8b1928f77bc02010200000000000000000002000000a7556140a47411410000000000000000b499ae59f3a0444f02000000000000000200000009000000098af13929ac53420000000000000000b688ae59f396444f0200000000000000090000000e00000000000000d415fd4100000000000000000b984f54f3700f4602010002000000000e0000001700000000000000dcafeb410000000000000000 gpsResult_ptr28_rec40=[0:bc778f92b1b82081,0x00020102,0,0,2,411174a4406155a7,3.52085,9.09098,0;1:4f44a0f359ae99b4,0x00000002,0,2,9,4253ac2939f18a09,0.000460699,52.9181,0;2:4f4496f359ae88b6,0x00000002,0,9,14,41fd15d400000000,0,31.6357,0;3:460f70f3544f980b,0x02000102,0,14,23,41ebafdc00000000,0,29.4609,0;4:46427ff3547b0b21,0x00000000,1,23,25,420124203aadc6f0,0.00132581,32.2853,0;5:4f44a1f359ae9b67,0x00030101,0,25,27,41798131397f10bc,0.000243249,15.594,0;6:4f44a1f359ae9b67,0x02020005,0,27,29,417ef14b00000000,0,15.9339,0;7:4634f0f3546f8dc8,0x00000002,0,29,45,433311c900000000,0,179.069,0;8:460f6ff3544f9658,0x04020202,0,45,47,424b279039be0111,0.000362404,50.7886,0;9:464279f3547b00ef,0x00000003,0,47,51,4395eda800000000,0,299.857,0;10:dc35e51ba9166914,0x01020002,0,51,54,41b8c7a000000000,0,23.0975,0;11:5b21ea90943036bd,0x00000003,0,54,57,42682b74395293e7,0.000200823,58.0424,0;12:dc35da1ba9165663,0x00030103,0,57,59,424f54de393600b5,0.000173571,51.8329,0;13:5b21e39094302ad8,0x00000004,0,59,74,4366a1f438ac59b9,8.21831e-05,230.633,0;14:8b9130427f341426,0x00030304,0,74,76,423e265e00000000,0,47.5375,0;15:5b1b5690942acf93,0x00000004,0,76,92,42ea74d338d9be32,0.000103828,117.228,0;16:a88d9c857d49083e,0x02030004,0,92,104,4231f0c500000000,0,44.4851,0;17:5271bc908f429c3b,0x00000004,0,104,106,42aa457c3867ae8f,5.52373e-05,85.1357,0;18:a88d9d857d4909f1,0x03050004,0,106,108,424840003a28f1fd,0.000644475,50.0625,0;19:ffa6984fc3782cce,0x00000005,1,108,110,4169c5c300000000,0,14.6108,0;20:dda97c10537d41d,0x01040009,0,110,112,427400a239244fca,0.0001567,61.0006,0;21:85f43b6a86254467,0x00000008,0,112,116,427fe7cf3e2067bc,0.156646,63.9764,0;22:85f4386a86253f4e,0x00000008,0,116,118,40cbf84700000000,0,6.37406,0;23:85f0b36a86222778,0x00000008,0,118,123,43a2d2f43a1fd934,0.000609773,325.648,0;24:dde14c1053ade5b,0x00040108,0,123,125,429a52c900000000,0,77.1617,0;25:5db97b1b99d86a7b,0x0000000a,0,125,127,4295d94c39d9e8c4,0.000415629,74.9244,0;26:dde16c1053ae1c1,0x0003010a,0,127,129,423000b9397639bc,0.000234819,44.0007,0;27:8400cb68d457ee70,0x00000009,0,129,135,4385543e39b83f5a,0.000351424,266.658,0;28:7f6a7e8858b300b3,0x02030109,0,135,137,4223122000000000,0,40.7677,0;29:8400cc68d457f023,0x00000009,0,137,139,41ed790500000000,0,29.6841,0;30:86ecb4885ca0780e,0x02030109,0,139,141,41f318de390a164c,0.00013169,30.3871,0;31:8400da68d45807ed,0x00000009,0,141,143,422ba2f1391c36ba,0.000148977,42.9091,0;32:86ecb9885ca0808d,0x02030109,0,143,145,421ea10738b27df0,8.51116e-05,39.6573,0;33:84045768d45b122b,0x00000009,0,145,147,43205b4238e191bc,0.00010756,160.356,0;34:1d9aea811c5dd71a,0x03020109,0,147,149,41facdd900000000,0,31.3505,0;35:14a33781173357f6,0x00000005,0,149,151,42a3d39600000000,0,81.9133,0;36:1db266811c7188af,0x00020205,0,151,160,41f57f3337cfa022,2.47509e-05,30.6871,0;37:4274deac90c47d21,0x00000003,0,160,166,42e597c700000000,0,114.796,0;38:3c25141b1b4f12dc,0x00000000,0,166,190,427a926f00000000,0,62.643,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=30368/0x76a0 gpsResult_state42=163 gpsResult_u48=4294967297/0x100000001 gpsResult_u50=17802515746883491584/0xf70f3dc00149d700 +2026-06-27 05:22:46.732 +138732ms hook GPSQueryResultFetch 0x7094b8 call=16549 queryId=95 tracked=1 perQueryCall=8 value=1 submitCall=95 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x79d3fbb0 ret_rva=0x520783 outPath=0x79d3fbb0 outPath_count=0 outPath_data=0x27 gpsResult_bytes20=be00000000000000304de6bb0500000027000000000000000000000000000000a076a34301000000010000000200000001d74901c03d0ff7483f084301000000 gpsResult_u20=190/0xbe gpsResult_u24=0/0x0 gpsResult_ptr28=0x5bbe64d30 gpsResult_vec20_data=0xbe gpsResult_vec20_count=5 gpsResult_vec20s16_data=0xbe gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=39/0x27 gpsResult_u30lo=39/0x27 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=39 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=30368/0x76a0 gpsResult_state42=163 gpsResult_u48=8589934593/0x200000001 gpsResult_u50=17802515746883491585/0xf70f3dc00149d701 +2026-06-27 05:22:48.581 +141581ms hook GPSQuerySubmit 0x70a42c call=99 manager=0x1a1d81d30 query=0x795bfa60 query_f00=0/0x0 query_f04=65535/0xffff query_f08=1082787844/0x408a0804 query_f0c=1/0x1 query_fcc=5/0x5 query_pos58=(-1569.68,1213.26,17.3722,0) resolveTraceWindowMs=1200 ret_rva=0x8d20d4 +2026-06-27 05:22:48.581 +141581ms hook GPSQuerySubmit result call=99 queryId=99 manager_nextIdD4=100/0x64 +2026-06-27 05:22:49.759 +141759ms hook GPSQueryResultFetch 0x7094b8 call=16874 queryId=99 tracked=1 perQueryCall=17 value=1 submitCall=99 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x52069c outPath=0x796bfbb0 outPath_count=0 outPath_data=0 gpsResult_bytes20=000000000000000000cdb9420100000000000000000000000000000000000000081c33a2010000000000000000000000001f829005000000003f084301000000 gpsResult_u20=0/0x0 gpsResult_u24=0/0x0 gpsResult_ptr28=0x142b9cd00 gpsResult_ptr28_rva=0x2b9cd00 gpsResult_vec20_data=0 gpsResult_vec20_count=1 gpsResult_vec20s16_data=0 gpsResult_vec20s16_count=1 gpsResult_u2c=1/0x1 gpsResult_u30=0/0x0 gpsResult_u30lo=0/0x0 gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=0 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=7176/0x1c08 gpsResult_state42=51 gpsResult_u48=0/0x0 gpsResult_u50=23899283200/0x590821f00 +2026-06-27 05:22:49.763 +141763ms hook GPSQueryResultFetch 0x7094b8 call=16875 queryId=99 tracked=1 perQueryCall=18 value=1 submitCall=99 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x520783 outPath=0x796bfbb0 outPath_count=0 outPath_data=0x3e0000003e gpsResult_bytes20=64010000640100001055f4b6050000003e0000003e0000000000000000000000081c33a2010000000100000001000000001f829005000000983f084301000000 gpsResult_u20=356/0x164 gpsResult_u24=356/0x164 gpsResult_ptr28=0x5b6f45510 gpsResult_vec20_data=0x16400000164 gpsResult_vec20_count=5 gpsResult_vec20_first= gpsResult_vec20_last= gpsResult_vec20s16_data=0x16400000164 gpsResult_vec20s16_count=5 gpsResult_vec20s16_first= gpsResult_vec20s16_last= gpsResult_u2c=5/0x5 gpsResult_u30=266287972414/0x3e0000003e gpsResult_u30lo=62/0x3e gpsResult_u34hi=62/0x3e gpsResult_ptr28_capacity30=62 gpsResult_ptr28_count34=62 gpsResult_ptr28_rec40raw=698aae59f397444f02000000000000000000000005000000edc9c94101600a3a00000000000000008c8f4f54f36b0f460300020200000000050000000c000000e5176741db6ecc3800000000000000008c8f4f54f36b0f4603000201000000000c0000000e00000060bcc938b5994b410000000000000000aee5b359f3244b4f02000000010000000e000000120000000000000048868b420000000000000000 gpsResult_ptr28_rec40=[0:4f4497f359ae8a69,0x00000002,0,0,5,3a0a600141c9c9ed,25.2236,0.000527859,0;1:460f6bf3544f8f8c,0x02020003,0,5,12,38cc6edb416717e5,14.4433,9.74813e-05,0;2:460f6bf3544f8f8c,0x01020003,0,12,14,414b99b538c9bc60,9.61951e-05,12.725,0;3:4f4b24f359b3e5ae,0x00000002,1,14,18,428b864800000000,0,69.7623,0;4:460f6af3544f8dd9,0x02020003,0,18,20,41903b9f38d91a8e,0.000103523,18.0291,0;5:460f69f3544f8c26,0x01000203,0,20,28,41a7303e00000000,0,20.8986,0;6:2056d215a8ac4a2b,0x00000000,1,28,32,423f28c600000000,0,47.7898,0;7:17363915a35ef221,0x01000200,0,32,36,41b8bf8e411ab74d,9.66975,23.0935,0;8:2056ce15a8ac435f,0x00000000,0,36,42,4129f6d33a83c6aa,0.00100537,10.6228,0;9:17363a15a35ef3d4,0x01020200,0,42,44,41938f7f00000000,0,18.4451,0;10:2056d015a8ac46c5,0x00000003,0,44,52,42d255a300000000,0,105.167,0;11:17363d15a35ef8ed,0x01030003,0,52,61,41c719f100000000,0,24.8877,0;12:290a7815ad9ce66c,0x00000003,1,61,63,41e8bb0500000000,0,29.0913,0;13:17363c15a35ef73a,0x00030107,0,63,65,412a8fe800000000,0,10.6601,0;14:290a7915ad9ce81f,0x00000003,1,65,70,4275833a39684916,0.000221525,61.3782,0;15:290a7b15ad9ceb85,0x00000003,1,70,75,41a5845d00000000,0,20.6896,0;16:2060d415a8b4a216,0x00020107,0,75,88,424887ee378cf702,1.68043e-05,50.1327,0;17:1f1ea69347776b9e,0x00000002,1,88,97,4347d31400000000,0,199.825,0;18:fbdbee10a9f4b370,0x00020105,0,97,99,4281085200000000,0,64.5163,0;19:1f221393477a5aac,0x00000002,0,99,115,42e4e19a00000000,0,114.441,0;20:7e21ce2bf1942821,0x00020302,0,115,125,41b3486a00000000,0,22.4104,0;21:d7a1e5686af0034f,0x00000008,0,125,127,41b79f99395519c8,0.000203229,22.9529,0;22:7e21cf2bf19429d4,0x00020208,0,127,129,41cf485c00000000,0,25.9103,0;23:e0cf936870480964,0x00000008,0,129,132,429d0c8237e8f654,2.77713e-05,78.5244,0;24:7e25502bf1973ade,0x01020008,0,132,134,41d82c7300000000,0,27.0217,0;25:d7a4f2686af24f3d,0x00000008,0,134,136,420b7c02392578d0,0.000157806,34.8711,0;26:fbd50110a9eeb50b,0x01020207,0,136,146,423995e638f8ff30,0.000118731,46.3964,0;27:1f0a26934765e914,0x00000002,1,146,154,4224feea00000000,0,41.2489,0;28:fbf40110aa09659a,0x02020303,0,154,156,41b9606b00000000,0,23.1721,0;29:ceb50933ce8bbba,0x00000003,0,156,158,40cf133200000000,0,6.47109,0;30:f2becb10a4aa59bf,0x01020203,0,158,160,41c8d41000000000,0,25.1035,0;31:ce4bf933ce359a9,0x00000003,0,160,163,420d822000000000,0,35.3771,0;32:f2bec610a4aa5140,0x01020003,0,163,165,421e2e023915f53f,0.000143011,39.5449,0;33:5b41893393b2c73,0x00000003,0,165,167,4285fd2800000000,0,66.9944,0;34:f2bbc410a4a81803,0x03020203,0,167,169,4219e1ef00000000,0,38.4706,0;35:5a19ff400bcc948a,0x00000003,0,169,175,4309365f00000000,0,137.212,0;36:bcb8c69be14391f3,0x03020203,0,175,177,42364fe800000000,0,45.578,0;37:4fb6254eb536e2d3,0x00000003,0,177,179,42e2a3f038b218b2,8.4923e-05,113.32,0;38:354bcbee202b6609,0x00000002,1,179,204,430a11a600000000,0,138.069,0;39:9815f04e532966ed,0x02020305,0,204,214,41e7fa2a,28.9972,0,0;40:9815f04e532966ed,0x01030304,0,214,226,4244ee2300000000,0,49.2326,0;41:916bdcd0d7f0298a,0x00000003,1,226,230,42e37c1238719f85,5.76074e-05,113.742,0;42:23c03e3ecef50635,0x00030207,0,230,232,42030cbc00000000,0,32.7624,0;43:916bdbd0d7f027d7,0x00000003,1,232,234,43182f4500000000,0,152.185,0;44:23c03d3ecef50482,0x02030007,0,234,236,41ef08b600000000,0,29.8793,0;45:13500ecbffc43f4b,0x00000007,0,236,238,428eda2200000000,0,71.426,0;46:23c0403ecef5099b,0x03020207,0,238,248,42300f03397f75f6,0.000243626,44.0147,0;47:9172c4d0d7f61f70,0x00000003,0,248,254,430b0d9100000000,0,139.053,0;48:218dba7e98a951b1,0x01020003,0,254,262,414deda600000000,0,12.8705,0;49:91764cd0d7f93c5f,0x00000003,0,262,270,420b45a000000000,0,34.818,0;50:218db77e98a94c98,0x00020203,0,270,279,41b84f2800000000,0,23.0387,0;51:9161c6d0d7e7afa3,0x00000006,0,279,297,43c6eee838aba02c,8.18375e-05,397.866,0;52:218db27e98a94419,0x02020106,0,297,299,41a4dd0300000000,0,20.6079,0;53:202f3fcccc6ff48d,0x00000002,0,299,301,41cd294d00000000,0,25.6452,0;54:202f3acccc6fec0e,0x00050202,0,301,303,427d390f00000000,0,63.3057,0;55:915e4ad0d7e4a718,0x00000005,1,303,323,4370a7d83932d9cd,0.000170565,240.656,0;56:1498b481172a24d8,0x01020003,0,323,325,4283878000000000,0,65.7646,0;57:83dd6b5f52f7018e,0x00000002,1,325,344,438893a3388354dd,6.26237e-05,273.153,0;58:7ad7cb5f4dc06557,0x00020105,0,344,347,423cb13b368aa365,4.13174e-06,47.1731,0;59:8409725f531c485e,0x00000002,1,347,352,42a67da03a0de561,0.00054129,83.2454,0;60:7ad7c95f4dc061f1,0x00020105,0,352,354,4237ffd400000000,0,45.9998,0;61:7ad4bd5f4dbe17b6,0x00000002,1,354,356,4296bf3100000000,0,75.3734,0] gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=7176/0x1c08 gpsResult_state42=51 gpsResult_u48=4294967297/0x100000001 gpsResult_u50=23899283200/0x590821f00 +2026-06-27 05:22:49.763 +141763ms hook GPSQueryResultFetch 0x7094b8 call=16876 queryId=99 tracked=1 perQueryCall=19 value=1 submitCall=99 submitRetRva=0x8d20d4 manager=0x1a1d81d30 outPath=0x796bfbb0 ret_rva=0x520783 outPath=0x796bfbb0 outPath_count=0 outPath_data=0x3e gpsResult_bytes20=64010000000000001055f4b6050000003e000000000000000000000000000000081c33a2010000000100000002000000011f829005000000483f084301000000 gpsResult_u20=356/0x164 gpsResult_u24=0/0x0 gpsResult_ptr28=0x5b6f45510 gpsResult_vec20_data=0x164 gpsResult_vec20_count=5 gpsResult_vec20s16_data=0x164 gpsResult_vec20s16_count=5 gpsResult_u2c=5/0x5 gpsResult_u30=62/0x3e gpsResult_u30lo=62/0x3e gpsResult_u34hi=0/0x0 gpsResult_ptr28_capacity30=62 gpsResult_ptr28_count34=0 gpsResult_vec38_data=0 gpsResult_vec38_count=0 gpsResult_flags40=7176/0x1c08 gpsResult_state42=51 gpsResult_u48=8589934593/0x200000001 gpsResult_u50=23899283201/0x590821f01 +2026-06-27 05:24:35.838 +247838ms GameState Running OnExit app=0x31fb80 diff --git a/presets/solver_weights/default.bin b/presets/solver_weights/default.bin new file mode 100644 index 0000000..bad0411 --- /dev/null +++ b/presets/solver_weights/default.bin @@ -0,0 +1 @@ +ÍÌL? \ No newline at end of file diff --git a/presets/solver_weights/highway-expensive.bin b/presets/solver_weights/highway-expensive.bin new file mode 100644 index 0000000000000000000000000000000000000000..489b4be740738e65efd755d2233313624ede2a9f GIT binary patch literal 4 LcmZQzaBu(s0K@=+ literal 0 HcmV?d00001 diff --git a/presets/solver_weights/mild.bin b/presets/solver_weights/mild.bin new file mode 100644 index 0000000..00555a5 --- /dev/null +++ b/presets/solver_weights/mild.bin @@ -0,0 +1 @@ +fff? \ No newline at end of file diff --git a/presets/solver_weights/proof-highway-cheap.bin b/presets/solver_weights/proof-highway-cheap.bin new file mode 100644 index 0000000..15b713f --- /dev/null +++ b/presets/solver_weights/proof-highway-cheap.bin @@ -0,0 +1 @@ +33³> \ No newline at end of file diff --git a/presets/solver_weights/strong.bin b/presets/solver_weights/strong.bin new file mode 100644 index 0000000..bbe4b9e --- /dev/null +++ b/presets/solver_weights/strong.bin @@ -0,0 +1 @@ +333? \ No newline at end of file diff --git a/presets/solver_weights/vanilla.bin b/presets/solver_weights/vanilla.bin new file mode 100644 index 0000000000000000000000000000000000000000..9c12e8adf98ba3c9bdad8481352f1dac07f3df52 GIT binary patch literal 4 LcmZQzXs`zW0Yd=5 literal 0 HcmV?d00001 diff --git a/red4ext/EdgeWeightGPS/src/Main.cpp b/red4ext/EdgeWeightGPS/src/Main.cpp index a7fc3e5..f89ee46 100644 --- a/red4ext/EdgeWeightGPS/src/Main.cpp +++ b/red4ext/EdgeWeightGPS/src/Main.cpp @@ -102,7 +102,7 @@ constexpr bool kEnableVerboseMappinRouteState = false; constexpr bool kEnableGpsMultiplierHooks = false; constexpr bool kEnableGpsAuxMultiplierHook = false; constexpr bool kEnableGpsMultiplierSignatureTrace = false; -constexpr bool kEnableGpsNodeMultiplierInlinePatch = false; +constexpr bool kEnableGpsNodeMultiplierInlinePatch = true; constexpr bool kEnableGpsCostTablePatch = false; constexpr bool kEnableGpsProviderClassPatch = false; constexpr bool kEnableGpsProviderClassPatchTrace = false; @@ -213,7 +213,7 @@ constexpr uint16_t kTrafficLaneFlagNoAiDriving = 0x2000; constexpr uint16_t kTrafficLaneFlagHighway = 0x4000; constexpr uint16_t kTrafficLaneFlagNoAutodrive = 0x8000; constexpr uintptr_t kMinimumReadableAddress = 0x10000; -constexpr float kGpsSolverHighwayMultiplier = 0.35f; +constexpr float kGpsSolverHighwayMultiplierDefault = 0.80f; constexpr float kGpsSolverGpsOnlyMultiplier = 1.10f; constexpr float kGpsSolverPavementMultiplier = 1.25f; constexpr size_t kGpsNodeMultiplierRoadTailPatchSize = 14; @@ -226,6 +226,7 @@ constexpr float kGpsSpatialRoadMultiplier = 1.0f; constexpr float kGpsSpatialGpsOnlyMultiplier = 1.20f; constexpr float kGpsSpatialPavementMultiplier = 1.35f; constexpr float kGpsSpatialUnknownMultiplier = 1.05f; +constexpr uint64_t kGpsSolverWeightsReloadIntervalMs = 500; constexpr uint64_t kGpsSpatialWeightsReloadIntervalMs = 500; struct GpsProviderClassOverride @@ -327,10 +328,12 @@ uint32_t gGpsResolveTraceWindowSerial = 0; std::array gGpsEdgeCostClassLogCounts{}; std::array gGpsNodeMultiplierRoadTailOriginal{}; void* gGpsNodeMultiplierRoadTailCave = nullptr; +uint8_t* gGpsNodeMultiplierRoadTailHighwayConstant = nullptr; bool gGpsNodeMultiplierRoadTailPatchApplied = false; std::mutex gGpsCostLogMutex; std::mutex gGpsAsyncLogMutex; std::mutex gGpsCostTablePatchMutex; +std::mutex gGpsSolverWeightsMutex; uint64_t gLogStartTick = 0; uint64_t gLogFrequency = 0; void* gMappinSetTrackedTarget = nullptr; @@ -569,9 +572,13 @@ std::array, 5> gGpsSpatialMultipliers = { kGpsSpatialPavementMultiplier, kGpsSpatialUnknownMultiplier, }; +std::atomic gGpsSolverHighwayMultiplier{kGpsSolverHighwayMultiplierDefault}; std::mutex gGpsSpatialWeightsMutex; +std::atomic gGpsSolverWeightsNextReloadCheckMs = 0; std::atomic gGpsSpatialWeightsNextReloadCheckMs = 0; +std::filesystem::file_time_type gGpsSolverWeightsLastWriteTime{}; std::filesystem::file_time_type gGpsSpatialWeightsLastWriteTime{}; +bool gGpsSolverWeightsFileKnown = false; bool gGpsSpatialWeightsFileKnown = false; uintptr_t GetImageBase(); @@ -598,6 +605,11 @@ std::filesystem::path GetSpatialWeightsPath() return GetPluginDirectory() / L"spatial_weights.bin"; } +std::filesystem::path GetSolverWeightsPath() +{ + return GetPluginDirectory() / L"solver_weights.bin"; +} + uint64_t GetElapsedMs() { if (!gLogStartTick || !gLogFrequency) @@ -652,6 +664,103 @@ void WriteFloat(uint8_t* aTarget, float aValue) std::memcpy(aTarget, &aValue, sizeof(aValue)); } +bool IsUsableSolverMultiplier(float aValue) +{ + return std::isfinite(aValue) && aValue > 0.0f && aValue < 20.0f; +} + +void StoreGpsSolverHighwayMultiplier(float aValue) +{ + gGpsSolverHighwayMultiplier.store(aValue, std::memory_order_relaxed); + + if (gGpsNodeMultiplierRoadTailHighwayConstant) + { + WriteFloat(gGpsNodeMultiplierRoadTailHighwayConstant, aValue); + FlushInstructionCache(GetCurrentProcess(), gGpsNodeMultiplierRoadTailHighwayConstant, sizeof(aValue)); + } +} + +void LogGpsSolverHighwayMultiplier(std::string_view aPrefix, float aValue) +{ + std::ostringstream line; + line << aPrefix << " highway=" << aValue; + LogRed4ext(line.str()); +} + +void MaybeReloadGpsSolverWeights(bool aForce = false) +{ + if (!kEnableGpsNodeMultiplierInlinePatch) + { + return; + } + + const auto nowMs = GetElapsedMs(); + if (!aForce && nowMs < gGpsSolverWeightsNextReloadCheckMs.load(std::memory_order_relaxed)) + { + return; + } + + std::lock_guard lock(gGpsSolverWeightsMutex); + if (!aForce && nowMs < gGpsSolverWeightsNextReloadCheckMs.load(std::memory_order_relaxed)) + { + return; + } + gGpsSolverWeightsNextReloadCheckMs.store(nowMs + kGpsSolverWeightsReloadIntervalMs, std::memory_order_relaxed); + + const auto path = GetSolverWeightsPath(); + std::error_code error; + const auto writeTime = std::filesystem::last_write_time(path, error); + if (error) + { + if (aForce || gGpsSolverWeightsFileKnown) + { + gGpsSolverWeightsFileKnown = false; + std::ostringstream line; + line << "solver weights file unavailable path=" << path.string() + << " using highway=" << gGpsSolverHighwayMultiplier.load(std::memory_order_relaxed); + LogRed4ext(line.str()); + } + return; + } + + if (!aForce && gGpsSolverWeightsFileKnown && writeTime == gGpsSolverWeightsLastWriteTime) + { + return; + } + + float highwayMultiplier = 0.0f; + std::ifstream input(path, std::ios::binary); + input.read(reinterpret_cast(&highwayMultiplier), static_cast(sizeof(highwayMultiplier))); + if (input.gcount() != static_cast(sizeof(highwayMultiplier))) + { + std::ostringstream line; + line << "solver weights reload skipped path=" << path.string() << " bytes=" << input.gcount() + << " expected=" << sizeof(highwayMultiplier); + LogRed4ext(line.str()); + gGpsSolverWeightsFileKnown = true; + gGpsSolverWeightsLastWriteTime = writeTime; + return; + } + + if (!IsUsableSolverMultiplier(highwayMultiplier)) + { + std::ostringstream line; + line << "solver weights reload skipped path=" << path.string() << " invalidHighway=" << highwayMultiplier; + LogRed4ext(line.str()); + gGpsSolverWeightsFileKnown = true; + gGpsSolverWeightsLastWriteTime = writeTime; + return; + } + + StoreGpsSolverHighwayMultiplier(highwayMultiplier); + gGpsSolverWeightsFileKnown = true; + gGpsSolverWeightsLastWriteTime = writeTime; + + std::ostringstream line; + line << "solver weights reloaded path=" << path.string() << " highway=" << highwayMultiplier; + LogRed4ext(line.str()); +} + bool InstallGpsNodeMultiplierInlinePatch() { if (!kEnableGpsNodeMultiplierInlinePatch || gGpsNodeMultiplierRoadTailPatchApplied) @@ -659,7 +768,7 @@ bool InstallGpsNodeMultiplierInlinePatch() return true; } - constexpr size_t kCaveSize = 64; + constexpr size_t kCaveSize = 80; auto* cave = static_cast( VirtualAlloc(nullptr, kCaveSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)); if (!cave) @@ -668,8 +777,9 @@ bool InstallGpsNodeMultiplierInlinePatch() return false; } - // Replaces the road-tail at 0x40bb98. This preserves the vanilla node93 - // multiplier, then applies the highway multiplier before returning. + // Replaces the road-tail at 0x40bb98. Reaching this block already means + // vanilla selected one of the road-style solver modes (0/2/4), so keep + // the change broad enough for manual GPS and autodrive-like callers. size_t offset = 0; const auto emit = [&](std::initializer_list aBytes) { for (auto byte : aBytes) @@ -691,7 +801,7 @@ bool InstallGpsNodeMultiplierInlinePatch() emit({0xF3, 0x0F, 0x59, 0x05, 0x00, 0x00, 0x00, 0x00}); // mulss xmm0, [rip+disp32] emit({0xC3}); // ret - while (offset < 40) + while ((offset % alignof(float)) != 0) { cave[offset++] = 0x90; } @@ -700,7 +810,8 @@ bool InstallGpsNodeMultiplierInlinePatch() WriteFloat(cave + offset, 1.1f); offset += sizeof(float); const auto highwayConstantOffset = offset; - WriteFloat(cave + offset, kGpsSolverHighwayMultiplier); + const auto highwayMultiplier = gGpsSolverHighwayMultiplier.load(std::memory_order_relaxed); + WriteFloat(cave + offset, highwayMultiplier); offset += sizeof(float); const auto caveAddress = reinterpret_cast(cave); @@ -743,12 +854,13 @@ bool InstallGpsNodeMultiplierInlinePatch() VirtualProtect(target, sizeof(patch), oldProtect, &ignoredProtect); gGpsNodeMultiplierRoadTailCave = cave; + gGpsNodeMultiplierRoadTailHighwayConstant = cave + highwayConstantOffset; gGpsNodeMultiplierRoadTailPatchApplied = true; std::ostringstream line; line << "gps-node-multiplier-inline-patch applied target_rva=0x" << std::hex << kGpsNodeMultiplierRoadTailRva << " cave=" << static_cast(cave) - << " highwayMultiplier=" << std::dec << kGpsSolverHighwayMultiplier; + << " highwayMultiplier=" << std::dec << highwayMultiplier << " modes=road-tail"; LogRed4ext(line.str()); return true; } @@ -782,6 +894,7 @@ void RemoveGpsNodeMultiplierInlinePatch() gGpsNodeMultiplierRoadTailCave = nullptr; } + gGpsNodeMultiplierRoadTailHighwayConstant = nullptr; gGpsNodeMultiplierRoadTailPatchApplied = false; } @@ -2338,16 +2451,21 @@ bool TryReadUint32FieldValue(void* aObject, uintptr_t aOffset, uint32_t& aValue) aValue); } +bool IsGpsRoadStyleMode(uint32_t aMode) +{ + return aMode == 0 || aMode == 2 || aMode == 4; +} + bool IsDrivingRouteJob(void* aRouteSystem, void* aActiveEntry) { uint32_t mode = 0; - if (TryReadUint32FieldValue(aActiveEntry, 0x80, mode) && mode == 2) + if (TryReadUint32FieldValue(aActiveEntry, 0x80, mode) && IsGpsRoadStyleMode(mode)) { return true; } auto* job = ReadPointerField(aRouteSystem, 0x90D0); - return TryReadUint32FieldValue(job, 0xC4, mode) && mode == 2; + return TryReadUint32FieldValue(job, 0xC4, mode) && IsGpsRoadStyleMode(mode); } void AppendFloatArray(std::ostringstream& aLine, const char* aLabel, const float* aValues, size_t aCount) @@ -4339,7 +4457,7 @@ float GpsSolverNodeWeightMultiplier(uint16_t aFlags) { if ((aFlags & kTrafficLaneFlagHighway) != 0) { - return kGpsSolverHighwayMultiplier; + return gGpsSolverHighwayMultiplier.load(std::memory_order_relaxed); } if ((aFlags & kTrafficLaneFlagGpsOnly) != 0) { @@ -5084,7 +5202,7 @@ float DetourGpsNodeMultiplier(void* aJob, void* aNode) result = ReadGpsSolverNonRoadMultiplier(retry); } - if (mode == 2 && std::isfinite(result)) + if (IsGpsRoadStyleMode(mode) && std::isfinite(result)) { result *= GpsSolverNodeWeightMultiplier(nodeFlags); } @@ -5352,6 +5470,8 @@ bool OnRunningUpdate(void* aApp) ++gUpdateLogCount; } + MaybeReloadGpsSolverWeights(); + return false; } @@ -5420,6 +5540,16 @@ RED4EXT_C_EXPORT bool RED4EXT_CALL Main(RED4ext::v1::PluginHandle aHandle, RED4e LogGpsSpatialMultipliers("spatial weights defaults", values); } + if (kEnableGpsNodeMultiplierInlinePatch) + { + std::ostringstream line; + line << "solver weights path=" << GetSolverWeightsPath().string(); + LogRed4ext(line.str()); + MaybeReloadGpsSolverWeights(true); + LogGpsSolverHighwayMultiplier("solver weights active", + gGpsSolverHighwayMultiplier.load(std::memory_order_relaxed)); + } + InstallGpsNodeMultiplierInlinePatch(); if (kEnableGpsQueryLifecycleHooks) diff --git a/tools/write_solver_weights.py b/tools/write_solver_weights.py new file mode 100755 index 0000000..83d518f --- /dev/null +++ b/tools/write_solver_weights.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Write EdgeWeightGPS solver highway presets as one raw float32 value.""" + +from __future__ import annotations + +import argparse +import struct +from pathlib import Path + + +DEFAULT_INSTALL_PATH = Path( + "/var/home/salt/.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/common/" + "Cyberpunk 2077/red4ext/plugins/EdgeWeightGPS/solver_weights.bin" +) + +PRESETS: dict[str, float] = { + "vanilla": 1.00, + "default": 0.80, + "mild": 0.90, + "strong": 0.70, + "proof-highway-cheap": 0.35, + "highway-expensive": 3.00, +} + + +def parse_multiplier(text: str) -> float: + value = float(text) + if not 0.0 < value < 20.0: + raise argparse.ArgumentTypeError("multiplier must be greater than 0 and less than 20") + return value + + +def write_weight(path: Path, value: float) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(struct.pack(" int: + parser = argparse.ArgumentParser() + parser.add_argument("preset", nargs="?", choices=sorted(PRESETS), default="default") + parser.add_argument("--value", type=parse_multiplier, help="explicit highway multiplier") + parser.add_argument("--output", type=Path, default=DEFAULT_INSTALL_PATH) + parser.add_argument("--preset-dir", type=Path, help="write every named preset into this directory") + args = parser.parse_args() + + if args.preset_dir: + for name, value in PRESETS.items(): + path = args.preset_dir / f"{name}.bin" + write_weight(path, value) + print(f"{path}: {value}") + return 0 + + value = args.value if args.value is not None else PRESETS[args.preset] + write_weight(args.output, value) + print(f"{args.output}: {value}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())