package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 三条「客户端在发、服务端从没接」的轻量回执(2026-09-25,见桌面清单 T1-1 / T1-2 / T1-18)。 // 共同背景:`logs/unknown-methods.log` 里它们都有记录,之前全部落到 typed-default 兜底。 // 只有 **INVOKE** 会真的卡住客户端(await 一个永远不来的回包),NOTIFY 只是静默无害 —— // 所以下面三条按各自的真实方向注册,回包类型一律以 dump.cs 的声明为准: // | 方法 | 日志方向 | dump 返回 | 这里怎么回 | // |---|---|---|---| // | `AskAgentStartNpcSound`(67003057) | INVOKE ×268 | `UXRPCTask<uint>`(dump.cs:1728967) | `ReturnAsync(msg, 0u)` | // | `AskReadCityPedia`(63817604) | INVOKE ×120 | `UXRPCTask`(void,dump.cs:1726930) | `ReturnEmptyOkAsync` | // | `AskSetClientLockTarget`(67197587) | **NOTIFY** ×79 | `void`(dump.cs:1729846) | 不回,只打日志 | // ⛑ `AskSetClientLockTarget` 在日志里是 **NOTIFY 不是 INVOKE**(`0x04015A93`,8 字节 = ulong targetId) // ⇒ 它不会让客户端 await 卡死,接它唯一的收益是拿到玩家当前锁定的目标(打日志观察)。 // 这里仍然注册 `HandlerPacketKind.Both`:万一将来客户端改用 INVOKE,也不会重新落兜底 // (`ReturnEmptyOkAsync` 对非 Invoke 直接返回 CompletedTask,不会凭空回包)。 // ⛑⛑ 硬规则 94:这些 id 必须同时在 `GameRouter.cs` 的 `Enabled4229938MethodIds` 里, // 否则编译通过但 handler 永不注册 —— Invoke 类还会让客户端 await 到超时。 // // // NPC 语音请求:`AskAgentStartNpcSound(ulong agentEntityId, uint libraryId)` — 67003057。 // 请求体实测 12 字节(`8300BE5306862F73 50FD1300` = u64 + u32)。 // 返回 `UXRPCTask<uint>` ⇒ 必须回一个 uint,取 0(=成功)。 // 与 `AskStartDialog` 同型(`GameRouter.Dialog.cs` 也是 `ReturnAsync(msg, 0u)`)。 // func GameRouter_MiscAcks_AskAgentStartNpcSound(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskAgentStartNpcSound var zero any; return zero } // // 城市图鉴点开详情:`AskReadCityPedia(uint cityPediaId)` — 63817604。 // 请求体实测 4 字节(`1561B900` = u32 cityPediaId)。返回 `UXRPCTask`(void)⇒ 回空 OK。 // 列表侧(295 条)早就通了,这条补的是「点开条目」那一半。 // func GameRouter_MiscAcks_AskReadCityPedia(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskReadCityPedia var zero any; return zero } // // 战斗锁定目标:`AskSetClientLockTarget(ulong targetId)` — 67197587。 // 请求体实测 8 字节;`0000000000000000` = 清除锁定。 // 纯观察:把 targetId 打出来,为以后「锁定/切目标」手感那条线留证据。 // func GameRouter_MiscAcks_AskSetClientLockTarget(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskSetClientLockTarget var zero any; return zero } // ------------------------------------------------------------------ // 第二批(2026-09-25 19:5x)。 // // ⛑⛑ 这一批的来源不是桌面清单,而是 **`logs/unknown-methods.log` 的真实统计**: // 清单 T0–T5 表的状态列已经滞后(T1-3 / T2-16 / T1-12 实际都已实现), // 所以本次改成「日志说了算」—— 取 09-23 以来仍在兜底的 INVOKE,再按**最后出现时间** // 过滤掉老记录,剩下的就是现在真的还在 await 的。 // // 这七条全部是 **INVOKE** 且 dump 声明返回 `UXRPCTask`(void)⇒ 空 OK 就是正解: // AskDoNpcAction (67257034, dump.cs:1730257) 最后出现 09-25 19:20 ← 最活跃 // SyncWorldBattlePlayers (63999507, dump.cs:1727899) 09-25 16:28 // AskReleaseLuaSlotEntityEvent(67314956, dump.cs:1729447) 09-25 16:26 // AskAddPaokuLimit (67763540, dump.cs:1730638) 09-25 16:25 // AskRemovePaokuLimit (67281330, dump.cs:1730641) // AskEnterMoveGround (67200298, dump.cs:1730539) 09-25 14:05 // AskLeaveMoveGround (67083087, dump.cs:1730542) 09-25 14:05 // // ⛑ 清单 T1-11 把 AskEnterMoveGround / AskLeaveMoveGround 记成 NOTIFY —— **日志里是 INVOKE** //(两边都注册了 Both 之外的可能),这里按 INVOKE 注册即可覆盖。 // // ⛑⛑ 没做的三条(都要真返回值,不能空 OK,留下一轮): // `AskTimePanelInfo` → `UXRPCTask`、`GetUploadObjectUrl` → `UXRPCTask`、 // `AskItemDestructibleCreate` → `UXRPCTask`。 // ------------------------------------------------------------------ func GameRouter_MiscAcks_AskDoNpcAction(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskDoNpcAction var zero any; return zero } func GameRouter_MiscAcks_SyncWorldBattlePlayers(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_SyncWorldBattlePlayers var zero any; return zero } func GameRouter_MiscAcks_AskReleaseLuaSlotEntityEvent(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskReleaseLuaSlotEntityEvent var zero any; return zero } func GameRouter_MiscAcks_AskAddPaokuLimit(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskAddPaokuLimit var zero any; return zero } func GameRouter_MiscAcks_AskRemovePaokuLimit(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskRemovePaokuLimit var zero any; return zero } func GameRouter_MiscAcks_AskEnterMoveGround(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskEnterMoveGround var zero any; return zero } func GameRouter_MiscAcks_AskLeaveMoveGround(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskLeaveMoveGround var zero any; return zero } // ------------------------------------------------------------------ // 第三批(2026-09-27)。 // // 前两批把「返回 void ⇒ 空 OK」的都收完了,剩下这五条是**要真返回值**的, // 空 OK 会让客户端拿到 0 字节后在反序列化处出问题(或拿到 null 后走错分支)。 // // ⛑⛑ 这一批的 wire 布局一律以 **`RPCDeserializeAuto.lua` 的返回值 reader** 为准, // dump.cs 只给字段声明、给不出 inline / 7Bit / presence 这些编码细节 —— 第二批之前的 // 几次踩坑都是「照 dump 写契约」。逐条依据: // // AskTimePanelInfo(63323227) rpc lua:10868 `Base.ReadStruct(Reader[612])` // dump.cs:1728862 `UXRPCTask` // ⇒ struct **无顶层标记**;回空列表 `FF 01` // GetUploadObjectUrl(63757076) rpc lua:12156 `Base.ReadComplex(Reader[588])` // dump.cs:1726xxx `UXRPCTask` // ⇒ complex 顶层 `FF` + string/u32/string // AskItemDestructibleCreate(67362514) rpc lua:15250 `reader.ReadUInt64()` // dump.cs:1730xxx `UXRPCTask` // ⇒ 裸 u64,8 字节 LE,无标记 // AskStartClimb(67646893) / AskEndClimb(67647726) ClientToGameSceneDelegate.lua:3706/3722 是 // `self.Notify(...)` ⇒ **NOTIFY 不是 INVOKE**,void 无参 // // ⛑ 最后两条爬墙是日志里**最新**的兜底记录(09-27 07:32,各 240 次上下), // 但方向是 NOTIFY ⇒ 不会让客户端 await 卡死,接它们纯粹是为了留证据 + 防将来改 INVOKE。 // ------------------------------------------------------------------ func GameRouter_MiscAcks_AskTimePanelInfo(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskTimePanelInfo var zero any; return zero } func GameRouter_MiscAcks_GetUploadObjectUrl(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GetUploadObjectUrl var zero any; return zero } func GameRouter_MiscAcks_AskItemDestructibleCreate(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskItemDestructibleCreate var zero any; return zero } func GameRouter_MiscAcks_AskStartClimb(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskStartClimb var zero any; return zero } func GameRouter_MiscAcks_AskEndClimb(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskEndClimb var zero any; return zero } // ------------------------------------------------------------------ // 第四批(2026-09-27 23:3x):桌面清单 **T1-44 A 组 16 条 void 回执**。 // // 选条方式跟第三批一样:**`unknown-methods.log` 的最后出现时间 + 逐条 grep 有无 handler**, // 不照清单状态列(硬规则 214)。 // // ⛑ 这 16 条的方向**逐条核过**:`INVOKE` 计数 1~156,`NOTIFY` **全为 0** ⇒ 全部按 `Invoke` 注册, // 不像第三批的爬墙两条需要 `Both`。 // ⛑ 返回**全部 void**(`RPCDeserializeAuto.lua` 的 `midToReturnMessageReader[id]` 函数体都为空) // ⇒ 空 OK 就是正解,不需要构造返回体。 // // 只有四条做了字段解析(受击/击飞那四条),因为它们是**唯一**能让服务端读到 // 「客户端实际用了哪个 stiffId / 多久 / 落地速度」的通道;其余打 hex 足够。 // ------------------------------------------------------------------ // 统一的「打日志 + 回空 OK」。void 回执默认走这里。 func GameRouter_MiscAcks_AckVoid(ctx context.Context, conn any, msg any, tag string) any { // Router implementation for GameRouter_MiscAcks_AckVoid var zero any; return zero } // ---- 受击 / 击飞 / 落地四条(有解析,是唯一真值来源)---------------------------- // // `ReportUnitHitFly`(67430580, 24B) = u64 defenderId | u64 attackerId | u32 hitFlyStiffId | f32 stiffTime。 // dump 里还有个同名 S2C 签名 `void ReportUnitHitFly(ulong attackPid, uint stiffId)`(@535988),别抄错参数个数。 // func GameRouter_MiscAcks_ReportUnitHitFly(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ReportUnitHitFly var zero any; return zero } // `ReportUnitHitFlyEnd`(67015647, 12B) = u64 defenderId | f32 speed。 func GameRouter_MiscAcks_ReportUnitHitFlyEnd(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ReportUnitHitFlyEnd var zero any; return zero } // // `ReportUnitFallGround`(67719880, 24B) = u64 unitId | i32 moveId | u32 stiffId | f32 stiffTime | f32 speed。 // 日志实测:`A986010000200000 | 0B000000 | C5030000 | 00000000 | 609D6330`(stiffTime 恒 0)。 // func GameRouter_MiscAcks_ReportUnitFallGround(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ReportUnitFallGround var zero any; return zero } // `ReportUnitFallGroundEnd`(67516089, 8B) = u64 unitId。 func GameRouter_MiscAcks_ReportUnitFallGroundEnd(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ReportUnitFallGroundEnd var zero any; return zero } // ---- 投技 / 钳制两条(2026-09-29 20:4x,纯抓包,不改任何状态)------------------ // // `AskControlPowerHoldEnemyUp`(67802701, 8B) = u64 enemyid —— 玩家把敌人钳制 / 举起来。 // 契约出处 `_lua_all/lua/LuaGen/AutoGen/ClientToGameSceneDelegate.lua:4771-4777` // (Serializer 只写一个 u64)。客户端侧是 C# native 调用,lua 里没有调用点。 // ⛑ 本轮只打日志 + 空回执,**不落地任何行为**(演出保护窗口等拿到时序再定)。 // 判据:日志里出现 `[MISC-ACK] control-power-hold-up` 才说明客户端真走了这条 RPC。 // func GameRouter_MiscAcks_AskControlPowerHoldEnemyUp(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskControlPowerHoldEnemyUp var zero any; return zero } // // `AskControlPowerHoldEnemyFallGround`(67043294, 8B) = u64 enemyid —— 把钳制中的敌人摔倒在地。 // 契约出处同上 `ClientToGameSceneDelegate.lua:322-328`。 // func GameRouter_MiscAcks_AskControlPowerHoldEnemyFallGround(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskControlPowerHoldEnemyFallGround var zero any; return zero } // ---- 其余 12 条(打 hex 即可)------------------------------------------------ // `AskCancelInteractionActionRedPoi`(63584158) — u32 交互项 id(§46 乐器线那条:99323001 = 木吉他)。 func GameRouter_MiscAcks_AskCancelInteractionActionRedPoi(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskCancelInteractionActionRedPoi var zero any; return zero } func GameRouter_MiscAcks_ReportPlayerStartCommonInteract(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ReportPlayerStartCommonInteract var zero any; return zero } func GameRouter_MiscAcks_AskPlayerOnMetro(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPlayerOnMetro var zero any; return zero } func GameRouter_MiscAcks_AskRemoveMapPin(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskRemoveMapPin var zero any; return zero } func GameRouter_MiscAcks_GmActiveBadgeEffect(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmActiveBadgeEffect var zero any; return zero } func GameRouter_MiscAcks_GMActivateNpcProfile(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GMActivateNpcProfile var zero any; return zero } func GameRouter_MiscAcks_EndWorldLifeGame(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_EndWorldLifeGame var zero any; return zero } func GameRouter_MiscAcks_AskRestaurantBuyFoods(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskRestaurantBuyFoods var zero any; return zero } func GameRouter_MiscAcks_RecordAgentBehavior(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_RecordAgentBehavior var zero any; return zero } func GameRouter_MiscAcks_ChangeVehicleDoorState(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ChangeVehicleDoorState var zero any; return zero } func GameRouter_MiscAcks_AskStartGuideByCondition(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskStartGuideByCondition var zero any; return zero } func GameRouter_MiscAcks_AskSetSpiritFashionVariantPreference(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskSetSpiritFashionVariantPreference var zero any; return zero } // ------------------------------------------------------------------ // 第五批(2026-09-27 23:4x):T1-44 **B 组 5 条要真返回值的**。 // // 前四批收的都是 void(空 OK);这五条空 OK 会让客户端拿到 0 字节后在反序列化处 // 拿到 null / 空壳而走错分支 ⇒ 必须按 lua 的返回值 reader 造真的返回体(硬规则 209)。 // // ⛑ 方向逐条核过:INVOKE 1~86 次、**NOTIFY 全 0** ⇒ 全部按 `Invoke` 注册。 // // ⛑⛑ 本批只保证**结构与 await 正确**,不保证语义正确(比如返回的 dialogId 是 0 = 无随机对话)。 // 真要做玩法(地图图钉持久化 / 世界生活局 / 篮球 / 武术赛季)得另开条目 —— 这里先把 // 客户端从"等不到回包"里放出来,并把请求参数打进日志给后面留数据。 // ------------------------------------------------------------------ // // `AskPutMapPinFar`(63522219):请求 `(uint raidId, float x, float z, byte type)`(实测 13B), // 返回 `PinData`(struct 无标记)= `u64 Id` + `UXVector3 PinPos`(3×f32)。 // 回一个落盘的自增 Id,并把请求里的 x/z 原样塞回 PinPos(y 补 0)—— 客户端拿到的是一个 // 坐标自洽的图钉,不会瞬移。⛑ 本服**不持久化**图钉(重启即丢),要存得另开条目。 // func GameRouter_MiscAcks_AskPutMapPinFar(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPutMapPinFar var zero any; return zero } // // `GetCharacterRandomDialog`(63175540):请求 `(uint agentId, uint MainTag, uint[] SubTag)`(实测 14B), // 返回裸 **u32** = 随机对话 id。 // ⛑ 本服没有随机对话表 ⇒ 回 **0**(= 无随机对话,客户端应走"不播"分支,最安全)。 // 先回 0 而不是编一个假 id:编 id 会让客户端去查表里不存在的行,比"没有"更难排查。 // 接它的收益 = 解 await + 日志留下 `agentId / MainTag / SubTag`(以后要接真对话得查 DialogConfig)。 // func GameRouter_MiscAcks_GetCharacterRandomDialog(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GetCharacterRandomDialog var zero any; return zero } // // `StartWorldLifeGame`(67864009):请求 `uint typeId`(实测 4B),返回裸 **u64** = 世界生活局实例 id。 // 号走 `IdCounterStore`(硬规则 104:重启不重号)。本服不跟踪对局,只发号解 await。 // func GameRouter_MiscAcks_StartWorldLifeGame(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_StartWorldLifeGame var zero any; return zero } // // `AskBasketballOperatorAction`(67028937):请求 `BasketballAskOperatorParam`(complex,实测 49B), // 返回裸 **u64**。**86 次,是本批最多的** —— 篮球机(§19 donor 段提过 T3-35 篮球 POI)。 // ⛑ 返回的 u64 语义不明(可能是操作 token / 球局 id)⇒ 回 **0** 并打请求 hex, // 等日志里看清 `BasketballAskOperatorParam` 的实际取值再决定要不要发号。 // func GameRouter_MiscAcks_AskBasketballOperatorAction(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskBasketballOperatorAction var zero any; return zero } // // `AskWushuTournamentSeasonData`(63308286):**无参数**,返回 `ReadComplex(Reader[611])` // = `u32 SeasonId / u32 CurrentRound / bool IsSeasonCleared / List7 Rounds / u32 LastChallengeRound / u32 LastChallengeChoice`。 // 本服没有赛季数据 ⇒ 回全 0 + **空 Rounds 列表**(`FF 01`)。 // ⛑ 空列表也要占 2 字节,所以契约里 `Rounds` / `OpponentBestStars` 字段不能省。 // func GameRouter_MiscAcks_AskWushuTournamentSeasonData(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskWushuTournamentSeasonData var zero any; return zero } // ------------------------------------------------------------------ // 第六批(2026-09-29):`unknown-methods.log` 近三天(09-27 / 09-28)**仍在兜底**的全部 INVOKE。 // // ⛑⛑ 26 万行的 unknown-methods.log 是 **09-15 起的累计**,top30 里绝大多数早就注册过了 // (清单状态列滞后 ⇒ 别照清单抄,硬规则 214)。本次取数方式: // ① 只取 ts >= 2026-09-27 的行;② 与源码 `[Handler(...)]` 做差集;③ 逐条核对方向。 // 结果 56 个真待办里,**INVOKE 且未注册的只有这 13 个**(其余都是 NOTIFY,只登记不打紧)。 // // ⛑ 方向:13 条 **全为 INVOKE、NOTIFY 计数 0** ⇒ 全部按 `Invoke` 注册,不需要 `Both`。 // // ⛑ 返回类型以 `RPCDeserializeAuto.lua` 的 `midToReturnMessageReader[id]` 为准: // **11 条在表里查不到** ⇒ 无返回值(void)⇒ 空 OK 就是正解; // `AskCloseConnectionToGame`(63990036) → `reader.ReadUInt32()` ⇒ 回 `0u`; // `AskMultiverseStatus`(63799383) → `Base.ReadComplex(Reader[288])` ⇒ 要造真的返回体 // (见 MiscMethods4229938.cs 的 `MultiverseStatusInfo4229938`)。 // // ⛑ 参数布局全部来自 **unknown-methods.log 的实测 hex**(这些 id 在 `midToReader` 里没有 // lua 侧参数 reader ⇒ dump.cs 是唯一线索,但 dump 只给签名不给编码 ⇒ 以字节长度反推为准)。 // `GMChangeNpcFavor`(28 次) / `GmDropReward`(9) / `FastReenter`(9) 是这批里最活跃的三条, // 都是客户端 GM 控制台(ALT+F1)发出来的 —— 接住它们 = 控制台按钮不再 await 卡死。 // ------------------------------------------------------------------ // // `GMChangeNpcFavor`(62371863, 9B) = `uint npcAgentId | uint favor | byte flag`(实测 // `1D506D05 10270000 00` ⇒ agent=91103261, favor=10000, flag=0)。**这批里最活跃(28 次)**。 // ⛑ 本服**没有好感度存储**(NpcLife 只有好感 NPC 的坐标与日程)⇒ 这次只解 await + 留数据, // 不真的改好感。要落真值得先建 favor store,属另一条线。 // func GameRouter_MiscAcks_GMChangeNpcFavor(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GMChangeNpcFavor var zero any; return zero } // // `GmDropReward`(62894352, 8B) = `uint rewardId | uint count`(实测 `C588DE00 0A000000` // ⇒ reward=14584005, count=10)。GM 控制台「发奖励」。本服无掉落表 ⇒ 只解 await + 留数据。 // func GameRouter_MiscAcks_GmDropReward(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmDropReward var zero any; return zero } // `FastReenter`(65694957, 0B) — GM 控制台「快速重进」,无参。 func GameRouter_MiscAcks_FastReenter(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_FastReenter var zero any; return zero } // // `AskVehicleSendGamePlaySignal`(63816400, 1B) = `byte signalId`(实测 `0B` = 11)。 // 客户端把车载玩法信号丢给服务端,返回 void ⇒ 空 OK。 // func GameRouter_MiscAcks_AskVehicleSendGamePlaySignal(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskVehicleSendGamePlaySignal var zero any; return zero } // `AskChangeSceneItemQuality`(67983820, 4B) = `uint quality`(实测 3)。场景物件画质档。 func GameRouter_MiscAcks_AskChangeSceneItemQuality(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskChangeSceneItemQuality var zero any; return zero } // // `AskPuppetGetup`(67548192, 8B) = `ulong puppetEntityId`(实测 `00E8764817000000` = 100000000000)。 // 倒地单位起身回执。 // func GameRouter_MiscAcks_AskPuppetGetup(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPuppetGetup var zero any; return zero } // `AskChangeRoleUseSystemName`(63927753, 1B) = `bool/byte`(实测 0)。 func GameRouter_MiscAcks_AskChangeRoleUseSystemName(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskChangeRoleUseSystemName var zero any; return zero } // // `AskMetroHit`(67907276, 25B) = complex:`u32 a | u64 unit | f32 v | u32 b | u32 c` // (实测 `FF 2C010000 00E8764817000000 00004041 9D474703 64000000` ⇒ a=300, unit=1e11, // v=12.0, b=55000093, c=100)。⛑ 字段语义未定 ⇒ 只按长度解析并打出来,不猜名字。 // func GameRouter_MiscAcks_AskMetroHit(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskMetroHit var zero any; return zero } // `AskMetroHitEnd`(67737840, 8B) = `ulong unitId`。 func GameRouter_MiscAcks_AskMetroHitEnd(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskMetroHitEnd var zero any; return zero } // // `AskSaveSettings`(63411797, 28B):尾部是一个 **长度前缀(1 字节)+ JSON**, // 实测 `… 0D 7B22333034303031223A317D` ⇒ len=13 + `{"304001":1}`(设置项 KV)。 // ⛑ 本服不持久化设置(重启即回默认)⇒ 只解 await + 把 JSON 打进日志。 // func GameRouter_MiscAcks_AskSaveSettings(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskSaveSettings var zero any; return zero } // // `AskCloseConnectionToGame`(63990036):参数 = 一个 string(**Int7 长度带 +1 偏置**), // 实测 `0C 4B69636B546F4C6F67696E` ⇒ 0x0C=12 ⇒ 11 字符 = `KickToLogin`。 // 返回 **u32** ⇒ 回 0(= 同意)。客户端自己会断连回登录,服务端不需要额外动作。 // func GameRouter_MiscAcks_AskCloseConnectionToGame(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskCloseConnectionToGame var zero any; return zero } // `AskClearSwitchInFashionCache`(67098371, 4B) = `uint id`(实测 15021095)。 func GameRouter_MiscAcks_AskClearSwitchInFashionCache(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskClearSwitchInFashionCache var zero any; return zero } // // `AskMultiverseStatus`(63799383, 0B):返回 `MultiverseStatusInfo`(complex,顶层 0xFF) // = 三个 `Dict<uint, byte>` + `ShowLastMutiId` + `CurMutiPanelId`。 // 本服没有多世界数据 ⇒ 回 **全 0 + 三个空字典**(空字典也占 `FF 00000000`)。 // ⛑ 空 OK 会让客户端读到 0 字节 ⇒ 反序列化直接 nil 走错分支,所以必须回真返回体。 // func GameRouter_MiscAcks_AskMultiverseStatus(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskMultiverseStatus var zero any; return zero } // ------------------------------------------------------------------ // 第七批(2026-09-29):客户端 **GM 控制台(ALT+F1)** 剩下的 9 条 INVOKE。 // // ⛑ 这 9 条**全部只出现过 1 次**(09-28 06:00–06:07 那一次控制台会话), // 单看频次毫无价值 —— 接它们的理由是另一条:它们是 **INVOKE**, // 漏登记 ⇒ 控制台按钮 await 到超时(硬规则 94),用户点了就是"没反应"。 // 加上第六批的 13 条,`unknown-methods.log` 近三天里的 **INVOKE 已全部有回执** // ⇒ 客户端理论上再无任何 await 挂死。剩下的 35 条全是 NOTIFY(静默无害)。 // // ⛑ 返回**全部 void**(`midToReturnMessageReader` 里 9 个 id 一个都没有)⇒ 空 OK 即正解。 // ⛑ 本批**不做真实现**:`GmUnlockSystem` 的 139 / `GmChangeSystem` 的 (0,1) 都指向 // 服务端没有的那张「系统解锁表」,编一个假结果比不回更难排查(硬规则 230)。 // 只解 await + 把参数打进日志,等以后真要建系统解锁表时这批日志就是原始数据。 // ------------------------------------------------------------------ // `GmWorldRefreshEnemyGroup`(69676618, 0B) — 刷新世界敌人组。 func GameRouter_MiscAcks_GmWorldRefreshEnemyGroup(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmWorldRefreshEnemyGroup var zero any; return zero } // `GmRecoverAllSkillCooldown`(69187025, 0B) — 清空全部技能 CD。 func GameRouter_MiscAcks_GmRecoverAllSkillCooldown(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmRecoverAllSkillCooldown var zero any; return zero } // `GmFinishAllGuides`(65956919, 0B) — 完成全部新手引导。 func GameRouter_MiscAcks_GmFinishAllGuides(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmFinishAllGuides var zero any; return zero } // // `GmUnlockSystem`(62248824, 4B) = `uint systemId`。 // ★ 2026-09-29 16:1x 实机后**升级为真实现**(原来是空回执): // 日志 `console-20260929-160541.log` 里这条一次会话被点了 **23 次**(12 个不同 systemId, // 且连点了两轮 16:12:48 / 16:12:49)⇒ 用户确实在用这个按钮,空回执没有意义。 // 落点是现成的:`SyncUnlockSystems`(64916476) 这个 S2C 我们**从来没推过**, // 而登录包 `RuntimePayloadFactory.cs:309` 一直在用 `ClientConfigRepository.UnlockSystemIds()` // 填 `PlayerInfoGuide.UnlockSystems` ⇒ 这里只要把新 id 并进同一份集合再推一次即可。 // ⛑ wire 以客户端 reader 为准(`RPCDeserializeAuto.lua:4801`): // `Base.ReadList7Bit(ReadUInt32)` ⇒ `FF`(集合 presence)+ **Int7 计数(+1 偏置)** + u32×n。 // `UxWriter.Int7(n)` 内部就写 n+1,所以直接传 `ids.Count`。 // ⛑ 只在会话内存(不持久化):重启后回到配置表的默认解锁集合。 // func GameRouter_MiscAcks_GmUnlockSystem(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmUnlockSystem var zero any; return zero } // 会话内的「已解锁系统」集合,初值 = 配置表默认解锁的那些(与登录包同源)。 func GameRouter_MiscAcks_GetUnlockedSystems(ctx context.Context, session *GameSession) []any { // Router implementation for GameRouter_MiscAcks_GetUnlockedSystems return nil } // // 推 `SyncUnlockSystems`(64916476):`FF` + Int7 计数(+1 偏置)+ u32 列表(已排序,便于核对)。 // func GameRouter_MiscAcks_PushUnlockSystemsAsync(ctx context.Context, session *GameSession, unlocked []any) any { // Router implementation for GameRouter_MiscAcks_PushUnlockSystemsAsync var zero any; return zero } // `GmUnlockPlanningBoardMultiPlayer`(65321165, 4B) = `uint id`(实测 0)。 func GameRouter_MiscAcks_GmUnlockPlanningBoardMultiPlayer(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmUnlockPlanningBoardMultiPlayer var zero any; return zero } // `GmRefreshAllDestructibles`(69405892, 4B) = `uint id`(实测 0)。 func GameRouter_MiscAcks_GmRefreshAllDestructibles(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmRefreshAllDestructibles var zero any; return zero } // `GmCompleteAgentProfileTarget`(62006155, 4B) = `uint id`(实测 0)。 func GameRouter_MiscAcks_GmCompleteAgentProfileTarget(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmCompleteAgentProfileTarget var zero any; return zero } // `GmChangeSystem`(65660287, 5B) = `uint systemId | byte enable`(实测 0 / 1)。 func GameRouter_MiscAcks_GmChangeSystem(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmChangeSystem var zero any; return zero } // `GmAddFan`(62042161, 8B) = `uint targetId | uint count`(实测 1224270 / 1)。 func GameRouter_MiscAcks_GmAddFan(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAddFan var zero any; return zero } // ------------------------------------------------------------------ // 第八批(2026-09-29):**全时段**仍未注册的 INVOKE 里,返回 void 的那些,一次清完。 // // ⛑⛑ 上一轮(第六/七批)只按「近三天」取数,结论写成「INVOKE 全部有回执」是**不严谨的** —— // 全时段(09-15 起)统计下来,仍未注册的 INVOKE 有 **56 个**。本批把其中返回 **void** 的 // 47 个一次接住;剩下 9 个要真返回值的见本批末尾「本批未做」清单,逐个评估性价比。 // // ⛑ 为什么这些「很久没出现」的也接:unknown-methods.log 只记录**真的发过**的请求, // 最后一次出现早 = 用户很久没碰那个入口,不等于它消失了。只要哪天点开, // INVOKE 就会让客户端 await 到超时(硬规则 94)。GM 控制台(ALT+F1)尤其如此 —— // 本批里 Gm*/Force* 占了 22 个,全是控制台上按了会卡住的按钮。 // // ⛑ 返回类型一律以 `RPCDeserializeAuto.lua` 的 `midToReturnMessageReader[id]` 为准: // 这些 id 在表里**查不到** ⇒ void ⇒ 空 OK 就是正解。 // // ⛑ 本批**不做真实现**:`GmAddVehicle` / `GmAddAllSpirits` / `GmUnlockAllQuest` 这些 // 看着像「该给结果」的,实际都需要各自的表与实体系统,编结果比不回更难排查(硬规则 230)。 // 只解 await + 把请求 hex 打进日志,等以后真要建系统时这批日志就是原始数据。 // ------------------------------------------------------------------ // `AskTeleportOnCrossBoundary`(67386879) — 跨界传送上报(**140 次,本批最多**)。 func GameRouter_MiscAcks_AskTeleportOnCrossBoundary(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskTeleportOnCrossBoundary var zero any; return zero } // `AskUseItems`(63959573) — 背包使用道具(`u64 itemUid | u32 count`,实测 12B)。 func GameRouter_MiscAcks_AskUseItems(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskUseItems var zero any; return zero } // `AskPoliceTakeCaseReward`(63234061) — 警察领取案件奖励。 func GameRouter_MiscAcks_AskPoliceTakeCaseReward(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPoliceTakeCaseReward var zero any; return zero } // `AskActivateNpcProfile`(63692493) — 激活 NPC 档案。 func GameRouter_MiscAcks_AskActivateNpcProfile(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskActivateNpcProfile var zero any; return zero } // `AskSwitchSpiritByTaskRole`(67290457) — 按任务角色切人。 func GameRouter_MiscAcks_AskSwitchSpiritByTaskRole(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskSwitchSpiritByTaskRole var zero any; return zero } // `ForceAcceptTask`(62802451) — GM 强制接任务。 func GameRouter_MiscAcks_ForceAcceptTask(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ForceAcceptTask var zero any; return zero } // `ForceSubmitTask`(62675545) — GM 强制交任务。 func GameRouter_MiscAcks_ForceSubmitTask(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_ForceSubmitTask var zero any; return zero } // `RecordSceneDeviceBehavior`(67705881) — 场景设备行为记录。 func GameRouter_MiscAcks_RecordSceneDeviceBehavior(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_RecordSceneDeviceBehavior var zero any; return zero } // `AskPlayerEnterWater`(67675748) — 入水。 func GameRouter_MiscAcks_AskPlayerEnterWater(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPlayerEnterWater var zero any; return zero } // `AskPlayerLeaveWater`(67252339) — 出水。 func GameRouter_MiscAcks_AskPlayerLeaveWater(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPlayerLeaveWater var zero any; return zero } // ⛑⛑ 2026-09-30:`AskStartTaxiNavigate`(67363555) 与 `AskEndTaxiNavigate`(67960304) // 的**真实现搬到了 `GameRouter.Taxi.cs`**(认单 → 派 Cruise → 判到达 → 收车费)。 // 这两个占位 AckVoid 必须删掉:同一个 mid 注册两次 handler 会直接冲突。 // ⇒ 别在这里补回来。 // `AskEndTaxiTeleport`(67643399) — 出租车传送结束(**跳过行程**用)。 // ⛑ 阶段一没做「长按跳过 → 传送」,所以这里仍是占位;真做了跳过要搬到 // GameRouter.Taxi.cs 去(同 Start/End 的处理方式)。 func GameRouter_MiscAcks_AskEndTaxiTeleport(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskEndTaxiTeleport var zero any; return zero } // `AskCreateCustomLink`(63155988) — 创建自定义联机链接(单机服无意义,只解 await)。 func GameRouter_MiscAcks_AskCreateCustomLink(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskCreateCustomLink var zero any; return zero } // `AskCancelInviterPlayerInteractio`(63438568) — 取消邀请者交互。 func GameRouter_MiscAcks_AskCancelInviterPlayerInteractio(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskCancelInviterPlayerInteractio var zero any; return zero } // `AskUpdatePlayerScenarioInfo`(63680600) — 更新剧情信息。 func GameRouter_MiscAcks_AskUpdatePlayerScenarioInfo(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskUpdatePlayerScenarioInfo var zero any; return zero } // `AskChangePlayerScenarioSlot`(63088205) — 切换剧情槽位。 func GameRouter_MiscAcks_AskChangePlayerScenarioSlot(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskChangePlayerScenarioSlot var zero any; return zero } // `AskChangeNameByItem`(63087020) — 改名卡改名。 func GameRouter_MiscAcks_AskChangeNameByItem(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskChangeNameByItem var zero any; return zero } // `AskSetSpiritWearFashionHiddenPartsWithSource`(63452716) — 时装隐藏部位(带来源)。 func GameRouter_MiscAcks_AskSetSpiritWearFashionHiddenPartsWithSource(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskSetSpiritWearFashionHiddenPartsWithSource var zero any; return zero } // `AskTakeNpcProfileProgressRewardWithWeb`(63898756) — NPC 档案进度奖励(Web 型)。 func GameRouter_MiscAcks_AskTakeNpcProfileProgressRewardWithWeb(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskTakeNpcProfileProgressRewardWithWeb var zero any; return zero } // `AskReportArcadeGameResult`(63878179) — 街机小游戏结果上报(**09-29 仍在发**)。 func GameRouter_MiscAcks_AskReportArcadeGameResult(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskReportArcadeGameResult var zero any; return zero } // `AskPoliceTrailTeleport`(63457607) — 警察追踪传送。 func GameRouter_MiscAcks_AskPoliceTrailTeleport(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPoliceTrailTeleport var zero any; return zero } // `AskPoliceFakeFileTakeReward`(63972564) — 警察假档案领奖。 func GameRouter_MiscAcks_AskPoliceFakeFileTakeReward(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskPoliceFakeFileTakeReward var zero any; return zero } // `AskTradeListItem`(63291047) — 交易行挂单。 func GameRouter_MiscAcks_AskTradeListItem(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskTradeListItem var zero any; return zero } // `RequestRevive`(67856952) — 请求复活。 func GameRouter_MiscAcks_RequestRevive(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_RequestRevive var zero any; return zero } // `GmDaVinciCode`(69864720) — GM 达芬奇码。 func GameRouter_MiscAcks_GmDaVinciCode(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmDaVinciCode var zero any; return zero } // `GmAddVehicle`(62135059) — GM 加车(**白名单里早就有、但一直没有 handler**)。 func GameRouter_MiscAcks_GmAddVehicle(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAddVehicle var zero any; return zero } // `GmAddHealItems`(65533890) — GM 加治疗道具。 func GameRouter_MiscAcks_GmAddHealItems(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAddHealItems var zero any; return zero } // `GmAddAllSpirits`(65674296) — GM 加全部角色。 func GameRouter_MiscAcks_GmAddAllSpirits(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAddAllSpirits var zero any; return zero } // `GmUnlockBadge`(62349595) — GM 解锁徽章。 func GameRouter_MiscAcks_GmUnlockBadge(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmUnlockBadge var zero any; return zero } // `GmUnlockAllQuest`(65436618) — GM 解锁全部任务。 func GameRouter_MiscAcks_GmUnlockAllQuest(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmUnlockAllQuest var zero any; return zero } // `GmSetMapEntrance`(65495623) — GM 设置地图入口。 func GameRouter_MiscAcks_GmSetMapEntrance(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmSetMapEntrance var zero any; return zero } // `GmSubmitEvent`(65753296) — GM 提交事件。 func GameRouter_MiscAcks_GmSubmitEvent(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmSubmitEvent var zero any; return zero } // `GmEnableThreatDebug`(69702004) — GM 威胁调试。 func GameRouter_MiscAcks_GmEnableThreatDebug(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmEnableThreatDebug var zero any; return zero } // `GmStartEnemyDetectDebug`(69199157) — GM 敌人侦测调试(开)。 func GameRouter_MiscAcks_GmStartEnemyDetectDebug(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmStartEnemyDetectDebug var zero any; return zero } // `GmStartEnemyDetectStateDebug`(69310359) — GM 敌人侦测状态调试(开)。 func GameRouter_MiscAcks_GmStartEnemyDetectStateDebug(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmStartEnemyDetectStateDebug var zero any; return zero } // `GmEndEnemyStrategyDebug`(69236550) — GM 敌人策略调试(关)。 func GameRouter_MiscAcks_GmEndEnemyStrategyDebug(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmEndEnemyStrategyDebug var zero any; return zero } // `GmStartSyncAIAction`(69345139) — GM AI 动作同步(开)。 func GameRouter_MiscAcks_GmStartSyncAIAction(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmStartSyncAIAction var zero any; return zero } // `GmEndSyncAIAction`(69026332) — GM AI 动作同步(关)。 func GameRouter_MiscAcks_GmEndSyncAIAction(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmEndSyncAIAction var zero any; return zero } // `GmRegenerateWildEnemy`(69561826) — GM 重生成野怪。 func GameRouter_MiscAcks_GmRegenerateWildEnemy(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmRegenerateWildEnemy var zero any; return zero } // `GmKillEnemy`(69834850) — GM 击杀敌人。 func GameRouter_MiscAcks_GmKillEnemy(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmKillEnemy var zero any; return zero } // `GmEnemyAiStopFlagByCamp`(69827777) — GM 按阵营停 AI。 func GameRouter_MiscAcks_GmEnemyAiStopFlagByCamp(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmEnemyAiStopFlagByCamp var zero any; return zero } // `GmAllSwitchToBattle`(69018541) — GM 全体切战斗。 func GameRouter_MiscAcks_GmAllSwitchToBattle(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAllSwitchToBattle var zero any; return zero } // `GmTestDamage`(69061923) — GM 测试伤害。 func GameRouter_MiscAcks_GmTestDamage(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmTestDamage var zero any; return zero } // `GmDeathPartyForcePlayerWin`(69208480) — GM 死亡派对强制胜利(联机玩法,单机无意义)。 func GameRouter_MiscAcks_GmDeathPartyForcePlayerWin(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmDeathPartyForcePlayerWin var zero any; return zero } // ---- 本批未做(8 个要真返回值的,逐个评估性价比,不盲动)---------------------------- // // ⛑⛑ **`AskVehicleNavigationPathPointsFr`(67650626) 不是缺口,是**别名误判** —— // `MethodId.cs:2737 AskVehicleNavigationPathPointsFr` 与 // `:4548 AskVehicleNavigationPathPointsFromPos` **是同一个 id 67650626**, // 而我们早就注册了后者(`GameRouter.VehicleNav.cs:63` + 白名单 `GameRouter.cs:540`)。 // 日志里的名字来自另一张名字表(`AskVehicleNavigationPathPointsFr`), // ⇒ **做差集时必须按 MethodId 比,不能按方法名比**(否则这类会永远显示为"未注册")。 // 同理 `AskVehicleNavigationPathLengthLi`(67251681) = `AskVehicleNavigationPathLengthList`。 // // 剩下真缺口的 8 个(都是 1~12 次,建契约的代价超过收益 ⇒ 全部跳过): // GmAskQueryAgentDetailList(65326141, 12) → Dict7Bit // AskTradeGetOrderList(63882492, 3) → List7Bit complex Reader[651] // AskBuyFerrisWheelTicket(63891470, 3) → 裸 byte(0/1 语义不明,不敢编) // AskGetBeLikeList(63113609, 2) → List7Bit complex Reader[591] // ShowAllServerDumpInfo(65624560, 1) → string // AskStartRPSInterrogation(63361257, 1) → complex Reader[614] // AskCreateAISession(63746945, 1) → complex Reader[587] // AskQueryFunplayHudData(63254781, 1) → Dict7Bit // ------------------------------------------------------------------ // 第九批(2026-09-29 16:2x):**实机之后**才冒出来的 3 条 GM INVOKE。 // // ⛑⛑ 教训:第八批那 56 个是拿**历史日志**做的差集 —— 用户这次点了以前没点过的 GM 按钮, // 立刻冒出 3 个全新的未注册方法(历史日志里一次都没有)。 // ⇒ **「收口」永远是相对当前日志的**,每次实机完都要重跑一次 `_wm_pending_byid.py`, // 不能因为「上次统计说没了」就不再查。 // // ⛑ `GmAddWeapon` 7 次里有 6 次是 **0.5~1 秒的连发重试**(await 没落地的典型形态), // 是最该接的一条。三条返回全部 void ⇒ 空 OK。 // ⛑ 不做真实现:加武器 / 加 buff / 删 buff 都要各自的实体与状态系统(硬规则 230)。 // ------------------------------------------------------------------ // // `GmAddWeapon`(69802168, 4B) = `uint weaponId`(实测 `BBC1C404` = 80201147 等)。 // **7 次,其中 6 次是连发重试** —— GM 控制台「加武器」,本批优先级最高的一条。 // func GameRouter_MiscAcks_GmAddWeapon(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAddWeapon var zero any; return zero } // // `GmAddOtherBuff`(69805439, 24B) = `uint buffId | ulong target | ulong caster | f32 v` // (实测 `3DEB2503 00E8764817000000 00E8764817000000 000080BF` ⇒ buff=52999997, // target=caster=1e11, v=-1.0)。 // func GameRouter_MiscAcks_GmAddOtherBuff(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmAddOtherBuff var zero any; return zero } // // `GmRemoveBuff`(69704292, 20B) = `uint buffId | ulong target | ulong extra` // (实测 `3DEB2503 00E8764817000000 0000000000000000`)。 // func GameRouter_MiscAcks_GmRemoveBuff(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_GmRemoveBuff var zero any; return zero } // ----------------------------------------------------------------------------------------- // 第十批 1 条(2026-09-29 20:4x)—— _wm_pending_byid.py 相对上一轮的**唯一新增 INVOKE**。 // 回滚 = 删本条 + GameRouter.cs 白名单里 `// 第十批` 那 1 行。 // ----------------------------------------------------------------------------------------- // // `AskSetSpiritFunctionSuitSchemeInfo`(63040765, 52B) — INVOKE,客户端 await 回执。 // ⛑ `MethodId.cs` 里该 id 有两个别名:`AskSetSpiritFunctionSuitSchemeIn`(:255) 与 // `...Info`(:4539),是同一个方法。登记用前者。 // RET(`RPCDeserializeAuto.lua` 的 `midToReturnMessageReader[63040765]`): // Base.ReadList7Bit(reader, ReadUInt32) —— 单字段 List<uint>, // 与 SyncUnlockSystems 完全同形 ⇒ **不能**用 ReturnEmptyOkAsync // (那会让 reader 读不到 presence 字节而走位)。 // 按硬规则:空列表 = FF 01(0xFF=presence,0x01=Int7(0) 的 +1 偏置), // 故直接手拼两字节,仿照 GameRouter.MiniGameEntry.cs 的 AskFarmerFryAccept。 // 为什么只回空、不做真持久化: // ① 频次 —— `unknown-methods.log` **全时段仅 1 次**(2026-09-29T10:28:09),玩家只点过一回; // ② 无模型 —— 服务端没有 per-spirit 的"功能套装方案"存储 // (市民侧只有 FunctionSuitId,且 player-progress.json 里全为 0, // 见 GameRouter.Civilians.cs:29); // ③ 参数布局未解干净 —— 实测 52B 试过 "u32 + u32 + n*(FF+u32)" 等多种切法都对不齐 // (尾部余 2 字节),贸然回显解出的 id 有把 UI 显示带错的风险。 // ⇒ 按"性价比过低跳过"原则,本次只**解除卡死**(不回包才会让客户端一直转圈), // 数据回显留待以后真需要时再做。真要做的话:先多抓几条不同 spirit/不同件数的 // 样本把布局钉死,再落一张 per-spirit 方案表。 // func GameRouter_MiscAcks_AskSetSpiritFunctionSuitSchemeInfo(ctx context.Context, conn any, msg any) any { // Router implementation for GameRouter_MiscAcks_AskSetSpiritFunctionSuitSchemeInfo var zero any; return zero }