Files
Ananta-ps/Ananta.Server/Ananta.Handlers/Game/GameRouter.ClawMachine.cs

76 lines
4.1 KiB
C#
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.
using Ananta.SDK.Logging;
using Ananta.SDK.Rpc;
using Ananta.Server.Protocol.Client4229938;
namespace Ananta.Server.Handlers.Game;
/// <summary>
/// 娃娃机 / 小游戏机(prefab <c>MiniGameMachine_Bee</c>,Spoon 图 <c>ClawMachineJiGuan_game.gcp</c>)。
///
/// 取证链(2026-09-24):
/// · 客户端 Player.log 13:56:31 在服务端补出来的 Bee 机上按 F 后报
/// <c>spoonFollowCamera1相机不存在!</c>,紧接着图被 dispose;
/// 13:47:29 在自带娃娃机(ClawMachineJiGuan_game_*,(2019,-8.6,2334) 一带有 14 台,locked=false)
/// 上按 F 后是 <c>InstantiationManager: Task 901 was cancelled</c> + <c>context isDisposed</c>。
/// · 两种情况客户端**都没有**向服务端发任何 RPC(unknown-methods.log 里这一段一条都没有),
/// 说明流程卡在客户端图内部,但历史上(09-19)客户端确实发过
/// <c>AskClawBuyTicket</c>(4 次)、<c>AskBuyMiniGameTicket</c>(1 次)、
/// <c>AskDoSpoonServerActionByType</c>(156 次)⇒ 一旦图跑通,下一步就会撞这几条。
///
/// 四条 Claw / 购票 RPC 在 dump.cs 里都是 <c>UXRPCTask</c>(void 返回),
/// 所以空包 + err=0 就是客户端期望的「OK」应答,不会反序列化失败。
/// AskDoSpoonServerAction / ByType 同样是 void 返回(图里的 SpoonServer 节点等一个回执),
/// 一并接住,否则 SpoonServerMultiOutput 节点会一直等到 context dispose。
///
/// ⛑ 回滚:把这四条从 GameRouter.cs 的 Enabled4229938MethodIds 里删掉即可(handler 不注册 =
/// 走 typed-neutral 兜底),不用删本文件。
/// </summary>
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);
}
/// <summary>
/// ★★ 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&lt;uint&gt;) → UXRPCTask
/// 1728829 AskMiniGame_BeeSettlement() → void
/// ⇒ 空包 + err=0 就是合法应答,不会反序列化失败。
/// </summary>
[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);
}
}