package methods // // 逮捕链路里唯一需要解析请求体的 C2S:AskPoliceExamInteract(63233964)。 // ⛑⛑ 这个形状是猜的,不是取证来的。理由与风险都写在这里,别在别处重复踩: // · 它在全部客户端 lua 里零引用(既没有 AskPoliceExamInteract_Serializer, // 也没有任何业务调用点)⇒ 由 C# 侧 gPoliceJobManager.cs 发起, // LuaGen/AutoGen 那份"契约真源"里查不到它。 // · RpcSurface.json 里也没有这一条(只有 AskGetArrestTimes / AskIsArrested / // AskPoliceEffectiveExam 三条),所以连 C# 签名都拿不到。 // · 按同族命名推断它是「盘查面板里点了一个选项」:第一个字段是目标 pid(u64)、第二个是选项 id。 // 顶层按 Inline 处理(参考硬规则 136:首字段是 primitive 就没有 marker)。 // ⇒ 因此调用方必须用 TryGetArgs 而不是 GetArgs,解析失败就退化成 // 「只回执 + 打 hex」,绝不能让异常冒出去(这是 INVOKE,服务端抛异常 = 客户端 await 到超时)。 // 真正确认形状的办法是实机抓一条:日志里的 [POLICE-ARREST] exam-interact hex=... // 就是为此留的取证口子。 // // // S2C SyncAgentPoliceExamData(68635920) —— 「这个 NPC 的案底」。 // 契约 100% 取自客户端 LuaGen/AutoGen/RPCDeserializeAuto.lua(不猜): // // self.midToReader[68635920] = function (reader) // local agentEntityId = reader.ReadUInt64(reader) // local data = Base.ReadComplex(reader, Auto.Reader[508]) // end // Auto.Reader[508] = function (reader, obj) // obj.FineTimes = reader.ReadUInt32(reader) // obj.Fines = Base.ReadDict7Bit(reader, ReadUInt32, ReadBoolean) // end // // 即线格式 [u64 agentEntityId][0xFF][u32 FineTimes][Dict7Bit<u32,bool> Fines]。 // ⛑ 顶层 Inline = true:首字段是 primitive ⇒ 帧首没有 marker(硬规则 136 同源判据)。 // ⛑ Complex 自带 0xFF:与 SyncSpiritPoliceJobInfo 同族,那份注释写明了 // "frame is [spiritId][0xFF][fields]"。 // ⛑ 极性是 LuaOnly(midToExportOption[68635920])⇒ **只有 lua 收得到、C# 不参与**。 // 这正是选它当「开盘查面板」触发信号的理由:客户端 lua // PoliceJobManager.OnSyncAgentPoliceExamData 会收到,我们注入的代码就钩在那里。 // // Auto.Reader[508] —— 案底正文。 // // ⛑ 必须标 [UxContract](不给的话 UxSerializer 直接抛 // ... is not a UX contract —— 是 _ux_wire_check 抓出来的,别等实机)。 // ⛑ 不要加 Inline:它是 Complex,帧里自带 0xFF marker(硬规则 136 反例)。 //