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
- Check that the character name passed to Start matches an entry known to AvatarGridIconRecognizer.GetWeaponType; register the missing character/alias in the recognizer metadata.
- Supply ForcedWeaponType explicitly when constructing TargetRole for characters whose weapon type is ambiguous or unmapped.
- 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
- Register every requested character in AvatarGridIconRecognizer's weapon-type map.
- Set ForcedWeaponType on TargetRole for custom/ambiguous characters.
- Validate weapon-type resolution up front in Start before running the state machine.
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
- 切换角色:当前角色状态为空
- 切换角色:无法为未指定槽位生成补位角色
- 切换角色:无法为 {_multiGamePlayerCount} 人联机的 {_playerIndex}P 生成可控槽位
- 天赋点击位置索引越界。
- 切换角色:未指定角色或同一实际角色被指定到多个槽位
AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13).
Data as JSON: /api/errors/ec8165666a5d2526.
Report an issue: GitHub.