76 lines
4.1 KiB
C#
76 lines
4.1 KiB
C#
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<uint>) → 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);
|
||
}
|
||
}
|