babalae/better-genshin-impact · error · PartySetupFailedException

切换角色:筛选面板缺少武器筛选项

Error message

切换角色:筛选面板缺少武器筛选项

What it means

Thrown by HandleFilterPanel as a hard invariant guard: the filter panel handler was reached but _pendingFilterWeaponType is null/empty. The weapon type is normally populated by SetCurrentRoleFilter from AvatarGridIconRecognizer.GetWeaponType(role.PrimaryCandidateName); if that lookup yielded nothing the whole filter workflow is invalid, so it fails fast instead of clicking blindly.

Solutions

  1. Check that the character name passed to Start matches an entry known to AvatarGridIconRecognizer.GetWeaponType; register the missing character/alias in the recognizer metadata.
  2. Supply ForcedWeaponType explicitly when constructing TargetRole for characters whose weapon type is ambiguous or unmapped.
  3. Validate _pendingFilterWeaponType in SetCurrentRoleFilter and throw there with the offending character name for a clearer failure point.

Example fix

// before
_pendingFilterWeaponType = role.ForcedWeaponType ?? Recognizer.GetWeaponType(role.PrimaryCandidateName);

// after
_pendingFilterWeaponType = role.ForcedWeaponType ?? Recognizer.GetWeaponType(role.PrimaryCandidateName);
if (string.IsNullOrWhiteSpace(_pendingFilterWeaponType))
{
    throw new PartySetupFailedException($"切换角色:无法解析 {role.PrimaryCandidateName} 的武器类型");
}
Defensive patterns

Strategy: validation

Validate before calling

foreach (var role in roles)
{
    var weapon = role.ForcedWeaponType ?? recognizer.GetWeaponType(role.PrimaryCandidateName);
    if (string.IsNullOrWhiteSpace(weapon))
    {
        throw new ArgumentException($"角色 {role.PrimaryCandidateName} 缺少武器类型映射,无法进入筛选");
    }
}

Type guard

static bool HasWeaponType(TargetRole role, AvatarGridIconRecognizer recognizer)
    => !string.IsNullOrWhiteSpace(role.ForcedWeaponType
        ?? recognizer.GetWeaponType(role.PrimaryCandidateName));

Try / catch

try { await switchTask.Start(...); }
catch (PartySetupFailedException ex) when (ex.Message.Contains("筛选面板缺少武器筛选项"))
{ _logger.LogError(ex, "角色武器类型未配置,请补充识别器元数据或 ForcedWeaponType"); }

Prevention

When it happens

Trigger: SetCurrentRole(role) ran but Recognizer.GetWeaponType(PrimaryCandidateName) returned null/whitespace, leaving _pendingFilterWeaponType empty when the state machine later transitions into SwitchCharacterState.FilterPanel.

Common situations: The requested character name is not present in the recognizer's weapon-type metadata table (typo, alias not registered, newly released character not yet added); the PrimaryCandidateName resolved from CandidateNames[0] is a display alias the recognizer does not map; ForcedWeaponType was left null for a custom role and GetWeaponType returned empty.

Related errors


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

Appendix: source

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

    /// <returns>点击筛选入口后返回 Success。</returns>
    [StateHandler(SwitchCharacterState.OpenFilterPanel, RetryTimeout = 9000, RetryInterval = 300, TransitionTimeout = 4000)]
    private Task<StateHandlerResult> HandleOpenFilterPanel(BvPage page)
    {
        GameCaptureRegion.GameRegion1080PPosClick(66, 46);
        return Task.FromResult(StateHandlerResult.Success);
    }

    /// <summary>
    /// 处理筛选面板。
    /// </summary>
    /// <param name="page">页面操作对象。</param>
    /// <returns>根据当前角色筛选需求进入元素或武器筛选状态。</returns>
    [StateHandler(SwitchCharacterState.FilterPanel, RetryTimeout = 12000, RetryInterval = 300, TransitionTimeout = 6000)]
    private Task<StateHandlerResult> HandleFilterPanel(BvPage page)
    {
        if (string.IsNullOrWhiteSpace(_pendingFilterWeaponType))
        {
            throw new PartySetupFailedException("切换角色:筛选面板缺少武器筛选项");
        }

        _workflowState = string.IsNullOrWhiteSpace(_pendingFilterElementType)
            ? SwitchCharacterState.SelectWeaponFilter
            : SwitchCharacterState.SelectElementFilter;
        return Task.FromResult(StateHandlerResult.Success);
    }

    /// <summary>
    /// 选择元素筛选项。
    /// </summary>
    /// <param name="page">页面操作对象。</param>
    /// <returns>点击元素选项后进入武器筛选;找不到选项时返回 Retry。</returns>
    [StateHandler(SwitchCharacterState.SelectElementFilter, RetryTimeout = 12000, RetryInterval = 300, TransitionTimeout = 3000)]
    private Task<StateHandlerResult> HandleSelectElementFilter(BvPage page)
    {
        if (string.IsNullOrWhiteSpace(_pendingFilterElementType))
        {

View on GitHub (pinned to a7cb36712d)