965 lines
49 KiB
Go
965 lines
49 KiB
Go
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<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<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<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
|
||
}
|
||
|