package methods // // Client 4229938: IClientToGameScene.ReportCanAssassinateEnemies(List<ulong> enemyids) — NOTIFY,67161256。 // 客户端 StealthManager(dump.cs:321145 起)每 CROUCH_ASSASS_CHECK_INTERVAL = 0.4 秒 // 跑一次 CrouchAssassinationUpdate():CrouchAssassinationUnitCheck 做粗筛, // CalculateCrouchAssassinationDetectValue(detectorPos, detectorEyeDir, detectedPos) 算背后夹角, // CrouchAssassinationVisibilityRaycastCheck 补可见性,最后由 SendCrouchAssassinationReport() // 把候选名单报上来(REPORT_LIST_LIMIT = 40)。 // 线格式证据:ClientToGameSceneDelegate.lua:1027 // SerializeBase.WriteList7Bit(writer, enemyids, writer.WriteUInt64, 0, "enemyids", false, 256, nil) // ⇒ Int7 计数(带 +1 偏置,规则 182)。与 ReportBeHacked(lua:595)完全同形, // 后者已实机解码成功 ⇒ 照抄它的标注。 // ⛑ 解码只用于驱动裁决回包;Notify 无 ack,解析失败不会卡住客户端。 // // // Client 4229938: IGameSceneToClient.SyncEnemyCanAssassinate(ulong agentId, bool canAssassinate) — 68218494。 // 契约来源:dump.cs:171433 GameSceneToClientImpl.SyncEnemyCanAssassinate(ulong, bool) // (真实现 override,不是 Null 桩);dump.cs:1873111 常量 = 68218494。 // ★ 为什么非发不可:这是服务端裁决回包。客户端只负责「我觉得这几个能暗杀」, // 真正的授权在这一条。收到 true 后 EnemyInteractCore.TrySetFeisuoCrouchAssassinInteract(true) // (dump.cs:537731)置 isFeisuoCrouchAssassinActive,再由 C# 回调 Lua // FeisuoAssassMgr:SetCanFeiSuoCrouchAss(canAssassin, LockEnemyId, t1, t2) // → UpdateAssinateGps() → gHackManager:AddFocusDangerEffect, // 同时 UnitStateConfig.CrouchAssass 点亮 HUD 的 ControlPower 暗杀按钮 // (MainMenuMgr.CheckInCrouchAssassination)。 // ⇒ 本服从不发这一条 ⇒ canAssassinate 恒 false ⇒ HUD 永远不出暗杀提示。 // ⛑⛑ 极性 Inline:CSharpOnly(lua 全仓只有 RPCMethodIdToName.lua:2940 的名字条目, // 没有 reader、没有 handler)⇒ 不能靠 lua 判 ReadStruct/ReadComplex(规则 183), // 只能靠同形先例。同 service、同为 CSharpOnly、同为「目标可交互」二态包的 // SyncUnitHackableState(68941159) 与 SyncVehicleHackableState 都用 // Inline = true 且已实机跑通 ⇒ 这里跟着用 Inline。 // 若实机报 ReadBuffer invalid size=N remain=N-1,唯一改法就是去掉 Inline(加 0xFF presence)。 //