using Ananta.SDK.Logging; using Ananta.SDK.Rpc; using Ananta.Server.Protocol.Client4229938; namespace Ananta.Server.Handlers.Game; /// /// 娃娃机 / 小游戏机(prefab MiniGameMachine_Bee,Spoon 图 ClawMachineJiGuan_game.gcp)。 /// /// 取证链(2026-09-24): /// · 客户端 Player.log 13:56:31 在服务端补出来的 Bee 机上按 F 后报 /// spoonFollowCamera1相机不存在!,紧接着图被 dispose; /// 13:47:29 在自带娃娃机(ClawMachineJiGuan_game_*,(2019,-8.6,2334) 一带有 14 台,locked=false) /// 上按 F 后是 InstantiationManager: Task 901 was cancelled + context isDisposed。 /// · 两种情况客户端**都没有**向服务端发任何 RPC(unknown-methods.log 里这一段一条都没有), /// 说明流程卡在客户端图内部,但历史上(09-19)客户端确实发过 /// AskClawBuyTicket(4 次)、AskBuyMiniGameTicket(1 次)、 /// AskDoSpoonServerActionByType(156 次)⇒ 一旦图跑通,下一步就会撞这几条。 /// /// 四条 Claw / 购票 RPC 在 dump.cs 里都是 UXRPCTask(void 返回), /// 所以空包 + err=0 就是客户端期望的「OK」应答,不会反序列化失败。 /// AskDoSpoonServerAction / ByType 同样是 void 返回(图里的 SpoonServer 节点等一个回执), /// 一并接住,否则 SpoonServerMultiOutput 节点会一直等到 context dispose。 /// /// ⛑ 回滚:把这四条从 GameRouter.cs 的 Enabled4229938MethodIds 里删掉即可(handler 不注册 = /// 走 typed-neutral 兜底),不用删本文件。 /// internal sealed partial class GameRouter { [Handler(MethodId.AskClawBuyTicket)] [Handler(MethodId.AskBuyMiniGameTicket)] [Handler(MethodId.AskClawSettlement)] [Handler(MethodId.AskClawDateFail)] private Task ClawMachineAccept(Connection conn, UxRpcMessage msg) { conn.Log.Info($"[CLAW] accepted {RpcMethodNames.Display(msg.MethodId)} bytes={msg.Body.Length}"); return conn.ReturnEmptyOkAsync(msg); } // ⛑ 只接 AskDoSpoonServerAction。ByType(67863523) 在 GameRouter.SceneDevices.cs 里已有 // OnAskDoSpoonServerActionByType —— 同一个 mid 注册两个 Invoke handler 会让服务端起不来 // (_handler_dup_check.py 会报 duplicate invoke handlers)。那边带 hex 日志,以它为准。 [Handler(MethodId.AskDoSpoonServerAction)] private Task SpoonServerActionAccept(Connection conn, UxRpcMessage msg) { conn.Log.Info($"[SPOON] server action accepted {RpcMethodNames.Display(msg.MethodId)} bytes={msg.Body.Length}"); return conn.ReturnEmptyOkAsync(msg); } /// /// ★★ MiniGame_Bee(娃娃机)结算三件套 —— 2026-09-24 补,铁证来自 unknown-methods.log。 /// /// 2026-09-22 15:03:31 → 15:04:10 客户端按这个顺序发过,说明**那次是能玩起来的**: /// AskBuyMiniGameTicket(63606259) 15:03:31.685 ← 买票(本文件已接) /// SetMiniGame_BeeScore(63375767) 15:04:10.921 /// AskReportArcadeGameResultBee(63696576) 15:04:10.991 /// AskMiniGame_BeeSettlement(63084657) 15:04:10.998 /// 后三条当时全掉进 unknown-methods.log ⇒ 结算 await 不到回执,表现就是 /// 「玩完卡住 / 拿不到奖励」。 /// /// dump.cs 三条全是 void 返回: /// 1727119 AskReportArcadeGameResultBee(ArcadeGameResultBee) → UXRPCTask /// 1728826 SetMiniGame_BeeScore(List<uint>) → UXRPCTask /// 1728829 AskMiniGame_BeeSettlement() → void /// ⇒ 空包 + err=0 就是合法应答,不会反序列化失败。 /// [Handler(MethodId.SetMiniGame_BeeScore)] [Handler(MethodId.AskReportArcadeGameResultBee)] [Handler(MethodId.AskMiniGame_BeeSettlement)] private Task MiniGameBeeAccept(Connection conn, UxRpcMessage msg) { conn.Log.Info($"[BEE] accepted {RpcMethodNames.Display(msg.MethodId)} bytes={msg.Body.Length}"); return conn.ReturnEmptyOkAsync(msg); } }