package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background // // 搜打撤的 GM / 面板面 —— 手动进出图、出场结算、状态输出、轮盘内容列举。 // 玩法逻辑本身在 GameRouter.Extraction.cs(背包/容器/搜索)与 // GameRouter.ExtractionWeapons.cs(轮盘实体化);这里只放「人要看 / 人要点」的那一层。 // ⛑ 三条排障常识(面板帮不上忙的那些): // 1. 改了没生效 → 先比对源码 mtime 与 logs/console-latest.log 里的服务端启动时间, // 确认这一版真的被跑过(同一天里踩过两次:跑的是改之前的 dll)。 // 2. [Handler] ≠ 已注册 → 还要进 GameRouter.cs 的 Enabled4229938MethodIds, // 漏了的判据是日志那行 unimplemented … typed-default void 0b。 // 3. 某一片 UI 整体空 → 客户端日志搜 attempt to perform arithmetic / // BindingWidgetShow failing,一个 nil 算术会崩掉整棵 store 树,不是只坏一个面板。 // // ------------------------------------------------------------------ enter / exit // // 把人切进一张搜打撤图(面板「进图」按钮与伪造匹配共用这一条)。 // 为什么不能直接改 state.ActiveRaidId:只有 SwitchSceneAsync 会重新起一次 // 进图事务(推新的 world-entry generation、重推 SyncEnterScene、重建角色控制), // 手动改字段的结果是「服务端认为进图了、客户端还站在老图上」。 // 进图之后的搜打撤专属包(SyncPlayerEnterExtractionShooter 空体 + 各包容量)由 // GameRouter.World.cs 在事务收尾时调 PushExtractionEnterAsync 补, // 和真实客户端自己走 EnterRaid 那条路完全同路径 —— 这里不再重复推一次。 // func GameRouter_ExtractionAdmin_EnterExtractionRaidAsync(ctx context.Context, session *GameSession, state any, raidId uint32) any { // Router implementation for GameRouter_ExtractionAdmin_EnterExtractionRaidAsync var zero any; return zero } // // 出场结算 SyncRaidSettlement(68995324):退图之前推,让客户端走完整的结算流程。 // ⛑ 线格式见 SceneMethods.SyncRaidSettlementArgs4229938 的注释 —— // 零战斗数据恒 32 字节,这是唯一能肉眼核对的东西;字节数一变,说明 complex 被写成 Inline 了。 // 我们不填战斗数据(SpiritBattleDatas 恒空):既没抓到过样本, // 也不值得为一段 UI 动画去碰 Auto.Reader[1334] 那套未知布局。 // func GameRouter_ExtractionAdmin_PushExtractionSettlementAsync(ctx context.Context, session *GameSession, isWin bool) any { // Router implementation for GameRouter_ExtractionAdmin_PushExtractionSettlementAsync var zero any; return zero } // ------------------------------------------------------------------ panel state // // GET /api/extraction/status 的返回体。 // 字段命名用小写驼峰 ⇒ 与前端 JS 一一对应;这里的形状改动时记得同步 // AdminWebServer.cs 里 exStatus() 那段,它是唯一消费者。 // func GameRouter_ExtractionAdmin_ExtractionStateForPanel(ctx context.Context, ) any { // Router implementation for GameRouter_ExtractionAdmin_ExtractionStateForPanel var zero any; return zero } // 每个包一行:id + 当前格数 + 物品数(面板用来确认「到底有没有东西」)。 func GameRouter_ExtractionAdmin_BagRows(ctx context.Context, owner any) []any { // Router implementation for GameRouter_ExtractionAdmin_BagRows return nil } // // 轮盘里会被实体化的那些武器(index = CellX + 2)。 // func GameRouter_ExtractionAdmin_ExtractionWheelContent(ctx context.Context, owner any) []any { // Router implementation for GameRouter_ExtractionAdmin_ExtractionWheelContent return nil } // // 轮盘上但不参与 Tab 切枪的物品(牛奶 / 药剂这类 —— 有格子、没有军械实例)。 // func GameRouter_ExtractionAdmin_ExtractionWheelInertItems(ctx context.Context, owner any) []any { // Router implementation for GameRouter_ExtractionAdmin_ExtractionWheelInertItems return nil } // // 面板「重推登录帧」:SyncPlayerInfo(64682159) 再发一次。 // 登录帧里的 InfoMinor.PlayerExtractionShooterInfo 是唯一把包柜塞给客户端的通道 // (ExtractionShooterRuntime4229938.FillLoginInfo),后期再改那些 bag 状态 // 客户端不会自己来问 ⇒ 排障时想"把整套包结构重来一遍",按这个按钮比重新登录快得多。 // func GameRouter_ExtractionAdmin_RepublishExtractionLoginFrameAsync(ctx context.Context, ) any { // Router implementation for GameRouter_ExtractionAdmin_RepublishExtractionLoginFrameAsync var zero any; return zero } // // 面板「任意 notify 探针」:把一条裸包按指定 methodId 直接推给客户端。 // 用途:搜打撤还剩的最大空白是撤离点 SyncExtractionShooterEvacuationRooms 这类 // 「不知道客户端到底认什么形状」的包。靠猜契约再编译再进游戏太慢,用这个探针可以直接 // 往客户端打任意 methodId + 任意 hex,从 Player.log 的 // deserialize failed / attempt to perform arithmetic 反推它要什么(硬规则 15)。 // ⛑️ 纯调试通道,不写任何状态、不进白名单(S2C 方向本就不需要)。 // ⛑️ hex 为空 = 推空体,用来试探「客户端有没有这一条的 impl」(空体最不容易崩)。 // 移植自捐赠端 v1.7(GameRouter.PushExtractionNotifyAsync)。 // func GameRouter_ExtractionAdmin_PushExtractionNotifyAsync(ctx context.Context, methodId uint32, hex any) any { // Router implementation for GameRouter_ExtractionAdmin_PushExtractionNotifyAsync var zero any; return zero }