This repository has been archived on 2026-10-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files

965 lines
49 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<TimePanelInfo>`、`GetUploadObjectUrl` → `UXRPCTask<UploadObjectUrl>`、
// `AskItemDestructibleCreate` → `UXRPCTask<ulong>`。
// ------------------------------------------------------------------
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<TimePanelInfo>`
// ⇒ struct **无顶层标记**;回空列表 `FF 01`
// GetUploadObjectUrl(63757076) rpc lua:12156 `Base.ReadComplex(Reader[588])`
// dump.cs:1726xxx `UXRPCTask<UploadObjectUrl>`
// ⇒ complex 顶层 `FF` + string/u32/string
// AskItemDestructibleCreate(67362514) rpc lua:15250 `reader.ReadUInt64()`
// dump.cs:1730xxx `UXRPCTask<ulong>`
// ⇒ 裸 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&lt;uint, byte&gt;` + `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<u64, ...>
// 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<u32, ...>
// ------------------------------------------------------------------
// 第九批(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&lt;uint&gt;,
// 与 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
}