Skip to content

八岐大蛇组队:默认邀请勾选后识别不到已勾选状态,check_and_invite 死循环卡死 #1881

Closed

Description

@allesgutefy

在提问之前...

描述你的问题

运行【八岐大蛇/御魂·虚无】任务,配置为邀请 1 人(队长端)。

第一场战斗结束后,在"默认邀请"环节,脚本点了"默认邀请"的勾选,但点完勾选后识别不到"已勾选"状态,陷入死循环,60 秒后触发 GameStuckError: Wait too long。

已定位到根因(附源码级证据):

tasks/Component/GeneralInvite/general_invite.py 的 check_and_invite() 中"默认邀请"分支:

if default_invite:
    if self.appear(self.I_I_DEFAULT) or self.appear(self.I_I_NO_DEFAULT):
        logger.info('Click default invite')
        while 1:                              # ← 死循环,无次数上限
            self.screenshot()
            if self.appear(self.I_I_DEFAULT):  # 唯一退出条件:识别到"已勾选"
                break
            if self.appear_then_click(self.I_I_NO_DEFAULT, interval=1):
                continue

assets.py 中两个模板定义:

I_I_NO_DEFAULT = RuleImage(roi_front=(542,343,36,35), roi_back=(542,343,36,35), threshold=0.8, ..., file="gi_i_no_default.png")  # 未勾选
I_I_DEFAULT    = RuleImage(roi_front=(541,342,41,39), roi_back=(541,342,41,39), threshold=0.8, ..., file="gi_i_default.png")     # 已勾选

问题:点完勾选后,gi_i_default.png(已勾选模板)匹配不上当前游戏版本的勾选框图标,导致 I_I_DEFAULT 永远不出现、死循环出不去。且该模板 roi_back == roi_front(无兜底搜索范围,仅 41×39 像素精确匹配)+ threshold=0.8,对游戏 UI 微小更新极度敏感。

如何复现

  1. 配置八岐大蛇/御魂任务,队长端邀请 1 人
  2. 正常跑第一场战斗
  3. 战斗结束后弹出"默认邀请",脚本点勾选
  4. 偶发识别不到"已勾选",卡死直至 60s 超时

预期行为

点完勾选后应识别到"已勾选"并退出循环,正常进入下一场,而非死循环卡死。

相关 Logs

2026-10-09 00:31:38.476 |    general_invite.py:0540 |     INFO | Click default invite
2026-10-09 00:32:38.083 |            device.py:0156 |  WARNING | Wait too long
2026-10-09 00:32:38.084 |            device.py:0157 |  WARNING | Waiting for set()
2026-10-09 00:32:38.133 |            logger.py:0354 |    ERROR | GameStuckError: Wait too long

截图

No response

还有别的吗?

建议修复方向(任选或组合):

  1. 更新 gi_i_default.png / gi_i_no_default.png 模板图适配当前游戏版本
  2. 降低这两个模板的 threshold(0.8 → 0.65~0.7),并给 roi_back 留搜索余量
  3. 给 check_and_invite() 的 while 1 循环加点击次数上限(如 5~10 次强制 break),防止识别失效时无限卡死

Activity

  1. allesgutefy commented on Oct 8, 2026

    @allesgutefy
    ContributorAuthor

    已自行解决,分享解决方案供参考。

    问题

    I_I_DEFAULT("默认邀请"已勾选)和 I_I_NO_DEFAULT(未勾选)两个模板阈值 0.8 过高,点完勾选后识别不到"已勾选"状态,导致 check_and_invite() 死循环卡死、60 秒超时 GameStuckError。

    解决方案

    将 tasks/Component/GeneralInvite/assets.py 中两个模板的阈值从 0.8 降到 0.65:

    # 改前
    I_I_NO_DEFAULT = RuleImage(roi_front=(542,343,36,35), roi_back=(542,343,36,35), threshold=0.8, ..., file="gi_i_no_default.png")
    I_I_DEFAULT    = RuleImage(roi_front=(541,342,41,39), roi_back=(541,342,41,39), threshold=0.8, ..., file="gi_i_default.png")
    
    # 改后
    I_I_NO_DEFAULT = RuleImage(roi_front=(542,343,36,35), roi_back=(542,343,36,35), threshold=0.65, ..., file="gi_i_no_default.png")
    I_I_DEFAULT    = RuleImage(roi_front=(541,342,41,39), roi_back=(541,342,41,39), threshold=0.65, ..., file="gi_i_default.png")

    改完重启 OAS 后问题解决。

    建议

    希望官方后续能:① 更新这两个勾选框模板图适配最新游戏版本;② 给 check_and_invite() 的 while 1 循环加点击次数上限(如 5~10 次强制 break),防止识别失效时无限卡死。

  2. github-actions commented on Oct 8, 2026

    @github-actions
    Contributor

    Issue 概要

    八岐大蛇组队队长在战斗结束后的“默认邀请”环节,点击未勾选框后无法识别已勾选状态,最终因循环无退出条件触发 GameStuckError: Wait too long。

    关键证据链

    点击此处展开
    1. Issue 已提供有效的复现步骤和文本日志;搜索确认、思考时间、FAQ 等必选确认项均已勾选。正文未勾选“我使用 OAS 的 dev 分支”,因此本次以 master 为分析基线。
    2. master 的 tasks/Orochi/script_task.py 在队长流程第 154、340 行调用 check_and_invite(self.config.orochi.invite_config.default_invite),所以八岐大蛇会进入共享邀请组件。
    3. master 的 tasks/Component/GeneralInvite/general_invite.py 第 537–546 行中,默认邀请分支执行:
      • 截图;
      • 若 I_I_DEFAULT 识别到则退出;
      • 否则尝试识别并点击 I_I_NO_DEFAULT,然后继续循环。
    4. 该循环没有超时、次数上限或“点击后状态未变化”的失败出口。只要 I_I_DEFAULT 持续匹配失败,函数就会一直循环,符合日志中从 “Click default invite” 到约 60 秒后 Wait too long 的现象。
    5. master 的 tasks/Component/GeneralInvite/assets.py 第 83–85 行显示两个复选框模板都使用 threshold=0.8,并且 roi_back 与 roi_front 相同,没有额外搜索范围。若当前客户端图标、缩放或渲染细节与模板存在差异,点击已经发生但已勾选状态仍可能无法匹配。
    6. 因 Issue 未附异常截图,无法仅凭远程源码确认是模板图片本身已过期、客户端缩放差异,还是点击后 UI 状态变化延迟;但“识别失败后无限循环”这一失效模式已由源码直接确认。

    最终 bug 原因

    • 直接结论:这是“勾选状态模板识别失败”与“无界状态等待循环”叠加导致的卡死。识别失败是触发条件,无界 while 1 是导致任务无法自恢复并最终超时的直接原因。
    • 证据链:Orochi 调用共享组件 → check_and_invite() 只接受 I_I_DEFAULT 作为成功条件 → I_I_DEFAULT 使用固定小 ROI 和 0.8 阈值 → 识别不到时没有超时/降级路径 → 60 秒后由设备层抛出 GameStuckError。

    给用户的建议

    • 可先关闭“默认邀请”选项,作为临时绕过方案;这会避免进入该默认勾选分支,但不解决模板识别问题。
    • 如果使用了非标准分辨率、缩放或近期更新过的客户端,建议确认模拟器输出为 1280×720,并保留一次包含邀请弹窗的 1280×720 错误截图。
    • 目前不建议仅通过重下完整包来判断问题已解决;源码中的无界循环在 master 仍然存在,因此即使资源暂时匹配成功,仍有再次卡死的风险。

    给开发者的修复方案

    点击此处展开
    • 首先给 check_and_invite() 的默认邀请状态等待增加有界超时或最大点击次数;超限后记录当前状态并返回失败,让上层执行安全退出/重试,而不是等待设备层的 60 秒兜底超时。
    • 更新并验证 gi_i_default.png、gi_i_no_default.png,结合当前客户端截图重新确认坐标、尺寸、缩放和阈值;适当扩大 roi_back 或采用更稳健的状态判断。
    • 点击后应等待状态变化,并区分“未勾选仍在场”“弹窗已消失”“模板不可识别”等情况,避免重复点击或静默死循环。
    • 为默认邀请状态增加匹配成功、匹配失败超时、弹窗消失三类测试;同时回归 Orochi、EvoZone、EternitySea 等复用 GeneralInvite 的任务。
    • 需要补充:失败时的 1280×720 游戏截图,以及完整的 general_invite.py 日志片段,用于确认是资源不匹配还是点击/渲染延迟。

    分支: master(正文未勾选 dev 分支)
    代码范围: tasks/Orochi;共享组件 tasks/Component/GeneralInvite
    相关类似 Issue: #605、#938、#833、#1369(均涉及组队邀请/邀请流程卡住;部分为不同任务或不同阶段)

    Warning

    Firewall blocked 1 domain

    The following domain was blocked by the firewall during workflow execution:

    • ab.chatgpt.com

    To allow these domains, add them to the network.allowed list in your workflow frontmatter:

    network:
      allowed:
        - defaults
        - "ab.chatgpt.com"

    See Network Configuration for more information.

    Generated by Issue Handle Bug for #1881 · codex · gpt56 · 13.5 AIC · ⌖ 2.9 AIC · ⊞ 13.6K · ◷

  3. allesgutefy commented on Oct 9, 2026

    @allesgutefy
    ContributorAuthor

    补充信息 - Issue 1881 根因已确认

    已确认以下必选项:

    • ✅ 已搜索现有 issues(确认无重复)
    • ✅ 提问题前花费超过5分钟排查
    • ✅ 阅读过文档 FAQ

    已验证的真实根因

    不是模板识别失败的问题(之前 Issue 描述中的假设是错误的)。

    真实根因:tasks/Component/GeneralInvite/general_invite.py 第543-547行,点击 I_I_NO_DEFAULT(勾选框)后,代码立即截图判断 I_I_DEFAULT 状态,但游戏UI渲染需要约0.8秒才能更新状态。导致循环无法在超时前break,触发 GameStuckError。

    已提交修复 PR

    PR #1886 已提交,包含完整修复代码:在点击 I_I_NO_DEFAULT 后增加 0.8 秒延时,等待UI状态更新。

    已在本地验证,0.8秒延时可正常识别已勾选状态并退出循环,不再重复邀请。

    请优先审核 PR #1886。

  4. added a commit that references this issue on Oct 10, 2026
  5. added 2 commits that reference this issue on Oct 10, 2026
    d6266dc
    f97dec0
  6. added a commit that references this issue on Oct 11, 2026
    d99afd2
  7. added 3 commits that reference this issue on Oct 11, 2026
    ca431a0
    cf6f9fa
    916e6eb
  8. added 3 commits that reference this issue on Oct 12, 2026
  9. added 3 commits that reference this issue on Oct 13, 2026
    44881fa
    7aff707
    1bfa8b4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions