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);
}
}