锦标赛 #1031
已結束两个玩家锦标赛,另外一个玩家直接关掉了小程序,系统依然检测不到它已经离开(并且一直跟我玩啦快5局)
0%
概述
两个玩家锦标赛,另外一个玩家直接关掉了小程序,系统依然检测不到它已经离开,导致我只能一直跟这个玩家玩,每次到他操作都得等操作倒计时完成他自动弃牌,很影响游戏体验.
锦标赛离线规则:
心跳丢失:10秒
判定离线:30秒
托管持续:最多 2 手(然后就判断为负)
Heads-up:
或者 离线超过30秒 直接判负(也就是从出现心态丢失后,60秒后,还没连上就直接判断他淘汰)
RA 是由 Redmine Admin 於 2 天 前更新
主要原因有 4 个:
-
关掉 Telegram 小程序不一定立刻等于 WebSocket 断开
牌桌前端 gameSocket 每 10 秒发心跳,服务端 game.websocket.idle-timeout 是 300 秒。
如果 Telegram WebView 只是隐藏/挂后台,JS 还活着或连接还没被系统杀掉,服务端会继续认为玩家在线。 -
前端没有在小程序隐藏/关闭时主动告诉牌桌“我离开了”
GameShellView.vue 的 visibilitychange 现在只在恢复可见时刷新 MTT 状态,没有在 hidden/pagehide/beforeunload 时发送离桌/暂离信号。
而 onBeforeUnmount 也只是解绑监听、断 MTT 实时 socket,没有明确 disconnectGameSocket() 或发送牌桌离开。 -
后端真正的断线入口依赖 UserHook.quit()
只有 ioGame 触发 GameUserHook.quit() 后,才会进入 UserHookRoomAction.handleTexasPokerDisconnect(),把玩家标记为 temporaryLeave 并同步 MTT 快照。
如果 WebSocket 没真正断,或者 quit 消息没到,MTT 侧就不会进入离桌状态。 -
MTT 离桌淘汰不是立即淘汰
当前逻辑是:- 断线后先同步为 waiting
- 再按 removeLeavePlayerAfterHands 判定,默认是 20 手
- 如果没有按手数配置,才走 5 分钟 away_timeout
-
服务端增加真实 lastSeen 检测
不只依赖 socket close,要记录玩家牌桌心跳时间;超过例如 20-30 秒没心跳,直接标记 temporaryLeave。 -
前端在 pagehide/visibilitychange hidden/beforeunload 主动上报暂离
能发成功就立即同步;发不成功也由服务端 lastSeen 兜底。 -
MTT 两人局特殊规则
2 人赛事里玩家断线后,不应该继续像正常活跃玩家一样撑多手。建议:断线后本手超时自动弃牌,下一手前标记离桌;达到配置手数立即淘汰。测试环境可以把默认离桌手数从 20 改小,比如 1-3。 -
Admin/H5 明确显示离桌状态
玩家状态要显示“暂离/离线/等待淘汰”,否则看起来像还在正常打。
按这个进行调整
RA 是由 Redmine Admin 於 2 天 前更新
- 狀態 從 待修复 變更為 待测试