package methods // // Client 4229938 vehicle-navigation (自驾 / 路线规划) payloads — see // GameRouter.VehicleNav.cs for the handler side. // ⛑️ 这份请求的字段顺序是按线上抓包反推的,不是照抄捐赠端的 DTO 命名 // (规则 111:donor 契约会被抓包证伪)。证据如下,`logs/unknown-methods.log` 里可复核: // // AskVehicleNavigationPathPoints (67317431) bytes=21 // 00000000 EE30BF44 713DCA3F DD94B444 01 00 01 01 00 // └ navReq └ target (u32 + vec3) └ bool×4 + byte profile // AskVehicleNavigationPathPointsFromPos (67650626) bytes=37 ← 比上面多 start(vec3) + EulerY(f32) // 00000000 2D94CC44 7A29A8BB 32C1BC44 EE30BF44 713DCA3F DD94B444 01 00 01 01 00 44655B43 // └ navReq └ start └ target └ flags └ EulerY // AskVehicleNavigationPathLength (67519267) bytes=16 ← 无 navReq,尾部 4B 是 4 个 bool/byte // // 实测当天 89 次请求全部是「起点在动、终点固定、每秒一次」⇒ 玩家正开着车跑导航, // 而我们当时回的是 **空点集 + 长度 0**(DefaultReturnCatalog 的 typed default)。 // ⛑️ 返回形状同样来自客户端:`DefaultReturnCatalog4229938` 里 67317431 / 67650626 // 的 shape 都是 complex(677:ReadUInt32+list7+list7),空值时 9 字节 // FF 00000000 FF 01 FF 01 —— 与捐赠端自己探针打印的期望值逐字节一致。 // 所以重点是:**帧必须是非内联根对象**(前面的 0xFF)+ 两个带 +1 偏置的 Int7 列表。 // // AskVehicleNavigationPathPoints (67317431) — route from "wherever the car is now". // // AskVehicleNavigationPathPointsFromPos (67650626) — same, but the client supplies the start // position explicitly (plus the car's heading) instead of letting the server guess it. This is // the variant actually used in play: 89 of today's requests were this one. // // // AskVehicleNavigationPathLength (67519267) — route distance in metres, no geometry. // Answered with a bare float (shape = "ReadSingle"). // // AskVehicleStartAutonomousDriving (67600663) — begin self-driving to a target. // AskVehicleChangeAutonomousDrivingTarget (67057156) — retarget mid-drive. // // Client 4229938: IGameSceneToClient.SyncVehicleAutonomousDrivingState (68349264) = // u64 vehicleEntityId + bool isStart。 // ★★ 这是「车会不会自己开」的唯一开关。取证链(2026-09-27): // GameSceneToClientImpl.lua:1438 → DriveVehiclesManager.SyncVehicleAutonomousDrivingState // 把它写进 autoDrivingVehicleDict;UI 的 SetAutoDriving 读的正是这张表, // 而真正的驾驶 AI 在 C# LX6.Drive.DriveManager(该包 exportOption = LuaAndCSharp,两边都收)。 // ⇒ 服务端不推这个包,车永远不会自动开,哪怕 Start 的回执是 Ok。 // wire 形状照抄同构的 SyncVehicleHackableState(也是 u64 + bool): // Inline = true ⇒ 裸字段、没有 0xFF 根 marker,与 lua reader 里的连续 // ReadUInt64 / ReadBoolean 逐字节对齐。 // // // Client 4229938: IGameSceneToClient.SyncPlayerAutonomousDrivingState (68767968) = // bool isInOverrideMode + bool isAutoDrivingBlocked + bool isImmersiveModeBlocked。 // 三个开关决定「自动驾驶按钮是否显示 / 是否可点」(InitAutoDriveValidCheck、 // GetAutoDriveInteractable)。不下发时三个值都是 nil —— nil 是 falsy,按钮恰好可用, // 但显式推全 false 才能让 GM 有办法把它关掉。 // // AskVehicleCancelAutonomousDrivingTarget (67836393) — clear/forget the nav target. // // The answer to both path-points methods (complex 677). Non-inline on purpose: the root 0xFF // is what the client's reader expects (see the byte notes above). //