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.

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)

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.