babalae/better-genshin-impact · error · PartySetupFailedException

切换角色:未找到目标角色

Error message

切换角色:未找到目标角色 {_currentRole.Name}

What it means

HandleFindAndClickAvatar could not locate the target character's avatar in the (filtered) character grid after all search attempts — direct recognition failed, and the friendship-sort loop (up to FriendshipSortSearchAttemptCount=3 toggling sort direction) also failed. The role is therefore unavailable on this account or unrecognizable, so the switch is aborted.

Solutions

  1. Verify the character is actually owned and not excluded by the active element/weapon filter (check _pendingFilterElementType/_pendingFilterWeaponType for this role).
  2. Confirm the character's avatar is present in the recognizer's trained set; add/retrain if missing.
  3. Lower/raise assetScale or MatchThreshold only after confirming capture resolution; re-run on a known 1080p capture.
  4. Check the role's CandidateNames includes all in-game display variants (costume/alias) so Matches/FindAndClickAvatar can hit.
Defensive patterns

Strategy: try-catch

Validate before calling

// before starting, confirm the character is plausibly available
var owned = await CheckOwnedCharacters(ct); // user-supplied
foreach (var name in requestedNames)
    if (!owned.Contains(name))
        throw new ArgumentException($"账号未拥有角色 {name}");

Try / catch

try { await switchTask.Start(...); }
catch (PartySetupFailedException ex) when (ex.Message.Contains("未找到目标角色"))
{ _logger.LogError(ex, "目标角色在筛选网格中未找到:检查账号拥有情况、筛选条件与识别器模型"); }

Prevention

When it happens

Trigger: FindAndClickAvatar(role, Recognizer, ct) returned false for every attempt; either UseFriendshipSort was true and all 3 sort-direction iterations missed, or it was false and the single direct scan missed.

Common situations: The character does not exist on the account (typo in config, not yet owned); element/weapon filter excluded it so it never appears in the grid; AvatarGridIconRecognizer model does not contain the character's icon (new/unreleased character, costume variant); grid card detection (DetectCharacterCards) rejected the card; game rendering at a different scale dropped the match below MatchThreshold=0.7.

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/cdbd686272ba4104. Report an issue: GitHub.

Appendix: source

Thrown at BetterGenshinImpact/GameTask/Common/Job/SwitchCharacterStateMachineTask.cs:858

                    avatarFound = true;
                    break;
                }

                _logger.LogDebug(
                    "切换角色:好感排序第 {Attempt}/{AttemptCount} 次未找到 {Name}",
                    attempt,
                    FriendshipSortSearchAttemptCount,
                    _currentRole.Name);
            }
        }
        else
        {
            avatarFound = await FindAndClickAvatar(_currentRole, Recognizer, _ct);
        }

        if (!avatarFound)
        {
            throw new PartySetupFailedException($"切换角色:未找到目标角色 {_currentRole.Name}");
        }

        if (!TryClickAnyText(page, ["更换", "加入"], Rect1080(382, 994, 87, 51)))
        {
            _logger.LogWarning("切换角色:未识别到“更换”或“加入”按钮");
            return StateHandlerResult.Retry;
        }

        if (_isAppendingRole)
        {
            _currentTeamSlots.Add(new TeamSlotSnapshot(_currentRole.Slot, _currentRole.PrimaryCandidateName));
            _currentTeamSlots = _currentTeamSlots.OrderBy(slot => slot.Slot).ToList();
            _expectedTeamCount++;
        }
        else
        {
            _currentTeamSlots = _currentTeamSlots
                .Select(slot => slot.Slot == _currentRole.Slot

View on GitHub (pinned to a7cb36712d)