專案

一般

配置概況

動作

锦标赛 #1031

已結束
需X 前B

两个玩家锦标赛,另外一个玩家直接关掉了小程序,系统依然检测不到它已经离开(并且一直跟我玩啦快5局)

锦标赛 #1031: 两个玩家锦标赛,另外一个玩家直接关掉了小程序,系统依然检测不到它已经离开(并且一直跟我玩啦快5局)

是由 需求 x2 天 前加入. 於 1 天 前更新.

狀態:
已关闭
優先權:
紧急
被分派者:
開始日期:
2026-04-29
完成日期:
完成比例:

0%

預估工時:

概述

两个玩家锦标赛,另外一个玩家直接关掉了小程序,系统依然检测不到它已经离开,导致我只能一直跟这个玩家玩,每次到他操作都得等操作倒计时完成他自动弃牌,很影响游戏体验.

锦标赛离线规则:

心跳丢失:10秒
判定离线:30秒
托管持续:最多 2 手(然后就判断为负)
Heads-up:
或者 离线超过30秒 直接判负(也就是从出现心态丢失后,60秒后,还没连上就直接判断他淘汰)

需X 是由 需求 x2 天 前更新 動作 #1

需求 x 先前提到:

两个玩家锦标赛,另外一个玩家直接关掉了小程序,系统依然检测不到它已经离开,导致我只能一直跟这个玩家玩,每次到他操作都得等操作倒计时完成他自动弃牌,很影响游戏体验.

锦标赛离线规则:

心跳丢失:10秒
判定离线:30秒
托管持续:最多 2 手(然后就判断为负)
Heads-up:
或者 离线超过30秒 直接判负(也就是从出现心态丢失后,60秒后,还没连上就直接判断他淘汰)

另外对应的状态,也要在玩家头像下面显示出来当前状态

RA 是由 Redmine Admin2 天 前更新 動作 #2

主要原因有 4 个:

  1. 关掉 Telegram 小程序不一定立刻等于 WebSocket 断开
    牌桌前端 gameSocket 每 10 秒发心跳,服务端 game.websocket.idle-timeout 是 300 秒。
    如果 Telegram WebView 只是隐藏/挂后台,JS 还活着或连接还没被系统杀掉,服务端会继续认为玩家在线。

  2. 前端没有在小程序隐藏/关闭时主动告诉牌桌“我离开了”
    GameShellView.vue 的 visibilitychange 现在只在恢复可见时刷新 MTT 状态,没有在 hidden/pagehide/beforeunload 时发送离桌/暂离信号。
    而 onBeforeUnmount 也只是解绑监听、断 MTT 实时 socket,没有明确 disconnectGameSocket() 或发送牌桌离开。

  3. 后端真正的断线入口依赖 UserHook.quit()
    只有 ioGame 触发 GameUserHook.quit() 后,才会进入 UserHookRoomAction.handleTexasPokerDisconnect(),把玩家标记为 temporaryLeave 并同步 MTT 快照。
    如果 WebSocket 没真正断,或者 quit 消息没到,MTT 侧就不会进入离桌状态。

  4. MTT 离桌淘汰不是立即淘汰
    当前逻辑是:

    • 断线后先同步为 waiting
    • 再按 removeLeavePlayerAfterHands 判定,默认是 20 手
    • 如果没有按手数配置,才走 5 分钟 away_timeout
  5. 服务端增加真实 lastSeen 检测
    不只依赖 socket close,要记录玩家牌桌心跳时间;超过例如 20-30 秒没心跳,直接标记 temporaryLeave。

  6. 前端在 pagehide/visibilitychange hidden/beforeunload 主动上报暂离
    能发成功就立即同步;发不成功也由服务端 lastSeen 兜底。

  7. MTT 两人局特殊规则
    2 人赛事里玩家断线后,不应该继续像正常活跃玩家一样撑多手。建议:断线后本手超时自动弃牌,下一手前标记离桌;达到配置手数立即淘汰。测试环境可以把默认离桌手数从 20 改小,比如 1-3。

  8. Admin/H5 明确显示离桌状态
    玩家状态要显示“暂离/离线/等待淘汰”,否则看起来像还在正常打。

按这个进行调整

RA 是由 Redmine Admin2 天 前更新 動作 #3

  • 狀態待修复 變更為 待测试

需X 是由 需求 x1 天 前更新 動作 #4

  • 狀態待测试 變更為 已关闭
動作

匯出至 PDF Atom