参考

函数参考

内置辅助函数

游戏内“函数”标签页中列为内置的辅助函数。公共辅助函数直接按名称调用;其他辅助函数需绑定为依赖项(选择自动补全项,或在“依赖项”中添加),再按其完整限定名调用。

240 个辅助函数中的 88 个。 清除筛选

Platform.actions.call 依赖项Calls a native API function in protected mode and returns its first result only when Rotation Master can read it.
Platform.actions.findSlot 依赖项Finds the spell-book slot of a spell with FindSpellBookSlotBySpellID.
Platform.actions.GetSpellRangeState 公共使用适当的客户端 API 或法术书栏位,读取某个单位针对特定法术的距离。没有距离限制的法术返回 applicable=false;否则 applicable=true,inRange 记录该单位是否在距离内。未知或无法访问的观测会返回 nil 及原因。
Platform.actions.spellID 依赖项Validates a spell ID argument.
Platform.announcement_recipient.GetAnnouncementRecipientGroupMembership 公共将确切的施法对象名称与当前有限的小队或团队名单进行匹配,然后通过单位标识观测其成员身份。名单数据缺失、含义不明确或正在变化时保持为不可用;绝不读取所选目标,也不在施法之间保留状态。
Platform.casting.durationSeconds 依赖项Computes the total length of a cast or channel in seconds from the millisecond start and end times in a UnitCastingInfo or UnitChannelInfo result.
Platform.casting.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.casting.GetUnitCastObservation 公共在探测或受限策略客户端上观测单位的施法或引导。已知不存在的单位或可读的非活动结果返回 active=false。活动记录包含 name,或在名称为机密时包含 nameReason(单位仍在施法),以及可独立获取的 remainingSeconds、durationSeconds、interruptible 和 spellID 字段;可选字段不可用时附带 remainingReason、durationReason、interruptibleReason 或 spellReason。存在性观测缺失、失败或受限时返回 nil 及原因。
Platform.casting.interruptibility 依赖项Converts the native notInterruptible flag of a cast or channel into an interruptible Boolean (its inverse).
Platform.casting.remainingSeconds 依赖项Converts the millisecond end time of a cast or channel into the seconds left, measured against a fresh GetTime() and clamped at zero.
Platform.casting.spellIdentity 依赖项Validates the spell ID field of a cast or channel result.
Platform.creature_type.GetUnitCreatureTypeID 公共在探测或受限策略客户端上,从原生 UnitCreatureType 的第二个返回值观测生物身份。先检查确切的 UnitExists(unit);可读的 false 会直接返回 false,不需要也不调用生物元数据。存在的单位要求可读的有限数字 ID;未使用的本地化名称不影响可用性。带符号、小数、零以及未来的有限 ID 都会作为已知值保留。所需信息缺失、失败、为 nil、受限或格式错误时返回 nil 及原因。不会添加生物枚举、翻译标题比较或长期缓存。
Platform.form.GetPlayerFormObservation 公共使用一次受保护的无参数 GetShapeshiftForm 调用观测玩家当前的形态。保留每个可读的有限数字结果,包括零、带符号和小数值;不会推断更严格的原生索引范围。缺失、失败、为 nil、受限或非有限的数据保持为不可用。不会添加形态数量、职业、法术 ID、单位或可选参数。
Platform.glyphs.GetGlyphItemInfo 公共使用受保护的原生物品元数据,将一个数字物品归类为所请求职业的雕文。职业是可选的,默认为可读取的玩家职业。这只确定物品分类,不确定装备状态,也不提供物品到雕文法术 ID 的映射。
Platform.glyphs.GetGlyphSocketSnapshot 公共在已验证的巫妖王之怒、大地的裂变和熊猫人之谜客户端布局上观测雕文插槽。返回 slots 和 complete 标记。每个插槽在已知锁定或为空时为 active=false,被占用时为 active=true 并附带 spellID,不可用时 active 为 nil 并附带原因。未知布局和失败的数量查询会返回 nil 及原因。这不会比较物品名称,也不能证明物品与法术身份的确切对应。
Platform.glyphs.integer 依赖项Returns true when value is a finite whole number no smaller than minimum, and false for anything else (including NaN and infinity).
Platform.glyphs.layout 依赖项Maps client information to the position in the GetGlyphSocketInfo result that holds the glyph spell ID.
Platform.glyphs.socket 依赖项Reads one glyph socket by calling fn(index) in protected mode and always returns a slot record with slot=index.
Platform.groups.GetGroupMembership 公共在已识别的客户端系列上读取公开的队伍成员身份。未知客户端不受支持。raidOnly 为 true 时检查 IsInRaid;为 false 或 nil 时使用原生默认的队伍类别检查 IsInGroup。可读的 false 结果保持为 false。缺失、失败、格式错误或受限的观测会返回 nil 及原因。
Platform.groups.GetUnitGroupMembership 公共读取指定单位是否属于玩家的小队或团队。raidOnly 为 true 时只查询 UnitInRaid;否则 UnitInParty 结果为 true 时直接返回,为 false 时继续查询 UnitInRaid,未知时保持为不可用。可读的 nil 团队索引表示 false;整数团队索引 1..40 表示 true。名称会原样传给原生 API;原生 API 是否接受名称查询需视客户端而定。
Platform.health_forecast.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.health_forecast.GetHealthForecastIdentityObservation 公共在探测或受限策略客户端上观测确切的 UnitExists(unit),然后仅对存在的单位观测 UnitGUID(unit)。已知不存在时为 false。存在的身份要求可读的非空 GUID;所需信息缺失、失败、格式错误或受限时为不可用。不会添加生命值、提供者或额外单位的观测。
Platform.health_forecast.GetHealthForecastProviderObservation 公共使用确切的单参数点号调用读取可选的 RealMobHealth。命名空间不存在(nil/false)时返回空记录。分别规范化当前值和最大值:nil/false 字段允许回退到原生值,数字零仍视为存在。所使用的提供者信息格式错误、失败、受限、为负或非有限时为不可用。不使用提供者或过期的后备缓存。
Platform.health_forecast.GetHealthForecastTimeObservation 公共为所需的生命值预测重新观测一次受保护的无参数 GetTime。要求结果可读且为有限数字;保留带符号和小数值,不额外加入单调、整数或非负的限制。不使用时钟缓存或额外的原生查询。
Platform.health_forecast.GetHealthForecastValueObservation 公共在单独的身份检查之后读取惰性的生命值标量。current 种类使用确切的 UnitHealth(unit);maximum 使用确切的 UnitHealthMax(unit)。探测或受限策略客户端接受可读的有限非负数字(包括零)。不会重复调用存在性/GUID 查询,也不会回退到其他元组。
Platform.health_forecast.providerValue 依赖项Normalizes one health figure returned by the RealMobHealth provider.
Platform.health_forecast.readField 依赖项Reads object[key] in protected mode.
Platform.instance.GetInstanceObservation 公共观测一个受保护的无参数 IsInInstance 元组。所需的可读布尔成员值与类型字段无关:已知在副本外时直接返回,不解释未使用的类型;在副本内时返回可读的字符串类型,或在该次要字段不可用时返回 instanceTypeReason。检测是否在副本外的调用方只需要成员值;在副本内比较类型时必须检查次要原因。不会添加户外、区域或单位推断。
Platform.items.finite 依赖项Returns true when value is a finite, nonnegative number (not NaN or infinity), and false for anything else.
Platform.items.GetItemInfoInstant 公共读取规范化的原生物品分类元数据。记录包含规范的 itemID、classID 和 subClassID,以及在可读且非空时的 equipLoc(未本地化的 INVTYPE_* 装备位置标记);不要求物品显示文本已加载。元数据缺失、失败、格式错误或受限时返回 nil 及原因。
Platform.items.identifier 依赖项Validates an item argument.
Platform.loss_of_control.GetLossOfControlCount 公共使用受保护的无参数点号调用,读取有文档的活跃失控数量。要求结果可读且为有限的非负整数。零表示一次完整的空扫描,不需要行 API。RM 将扫描限制为 256 行,超出该资源预算时返回不可用;这并不是原生声明的最大值。所需观测缺失、失败、受限或格式错误时保持为不可用。
Platform.loss_of_control.GetLossOfControlEvent 公共按原生索引和所请求的主题种类,读取一条有文档的活跃失控记录行。type 查询只需要可读的控制类型字符串;school 查询只需要可读的有限非负整数法术类型掩码。可选的计时以有限的 timeRemaining 或逐字段的显式原因返回,因此不相关的主题不需要可用的计时器。缺失的行是不可用的快照观测。不会使用显示字段、推断的截止时间、持续时间总和、最大值或原生别名回退。
Platform.mobinfo2.finite 依赖项Checks that a value is a readable finite number.
Platform.mobinfo2.GetMobInfo2Observation 公共在探测或受限策略客户端上读取可选的 MobInfo2 历史观测。只缓存确切的所选单位存在性;UnitName 的第一个结果、UnitLevel 的第一个结果以及三参数的 MI2_GetMobData(name,level,unit) 点号调用每次都会重新获取。已知不存在的单位,以及成功返回的未记录的 nil 或省略的历史,与不可用的原生/提供者信息保持区分。保留可读的 runner 标量真值、法术类型符号以及缺少 Hits 时默认为一。正的抗性比例必须有限;完全免疫会使用有限的 Hits,而部分免疫只需要其负值的法术类型观测。绝不推断原生抗性或借用旧记录。
Platform.mobinfo2.hitCount 依赖项Reads the hit count for a spell school from a MobInfo2 resists table (the field named school.."Hits").
Platform.mobinfo2.presence 依赖项Checks whether a unit exists with one protected UnitExists call.
Platform.mobinfo2.readField 依赖项Reads object[key] in protected mode for MobInfo2 data.
Platform.pet.GetPetObservation 公共观测宠物是否确切存在,并可选地观测其经 GetUnitName 格式化的显示名称。仅查询存在性时从不需要名称数据。已知不存在时会跳过名称查询。仅在请求时,存在的宠物才需要可读的非空名称;所需观测缺失、失败、为 nil、受限或格式错误时返回 nil 及原因。显示辅助函数只以原有的单个宠物参数调用,不回退到 UnitName,也不推断动作条、生命值或技能状态。
Platform.player_flags.GetPlayerFlagObservation 公共观测一个独立的无参数玩家标记:stealthed 使用 IsStealthed,control 使用 HasFullControl,outdoors 使用 IsOutdoors。可读的 true 和 false 保留其含义。所需数据缺失、失败、为 nil、受限或格式错误时返回 nil 及原因。不会添加存在性、副本或技能可用性的推断。
Platform.player_movement.GetPlayerMovementObservation 公共在受支持且可读的客户端上观测玩家当前的移动速度。这只针对 player 查询 GetUnitSpeed,不检测其他单位,也不重定向载具所有权。零表示静止;正的有限小数速度仍然有效。缺失、失败、受限或格式错误的观测会返回 nil 及原因。
Platform.points.GetPlayerComboPointObservation 公共观测显式选择的 TBC 玩家连击点传输方式。current 只使用 GetComboPoints(player,target);maximum 使用带原始选择器的 UnitPowerMax(player,powerType)。其他客户端系列在此不可用,必须使用其现有的点数能量观测器。保留可读的有限带符号、小数和零值。缺失、失败、受限或格式错误的数据保持为不可用;所选的连击点查询失败时绝不会回退到 UnitPower。这不会观测其他角色,也不会添加缓存。
Platform.points.GetUnitPointFragmentObservation 公共观测客户端以碎片形式报告的点数资源(熊猫人之谜的爆燃灰烬)。current 严格使用 UnitPower(unit,powerType,true),maximum 严格使用 UnitPowerMax(unit,powerType,true);结果除以暴雪的 MAX_POWER_PER_EMBER(10),因此 35 个碎片即为 3.5。仅限探测策略。缺失、失败、受限或格式错误的数据保持不可用;绝不回退到整单位查询。不会添加缓存。
Platform.points.GetUnitPointIdentityObservation 公共为点数资源条件观测确切的所选单位是否存在,并可选地观测其职业文件名。已知不存在时返回 exists=false,不读取职业。存在的单位只在请求时需要 UnitClass 的第二个返回值;未使用的本地化名称和 ID 不影响可用性。所需观测缺失、失败、受限或格式错误时保持为不可用。这不会选择资源或缓存身份。
Platform.points.GetUnitPointPowerObservation 公共使用确切的双参数 UnitPower 或 UnitPowerMax 查询,读取一个显式选择的点数资源数量。选择器为必需;不会推断主要资源或重新映射角色。保留有限的带符号、小数和零数量,不进行截断。缺失、失败、受限或非有限的数据保持为不可用。当前值和最大值是分开的观测,因此调用方可以共享当前值快照,同时按需延迟请求最大值。
Platform.range.GetNameplateMaxDistance 公共使用受支持的 CVar API 读取当前正的姓名板可见距离。这会限制“距离内计数”查询;它不能证明所有附近的单位都已被观测到。缺失、格式错误、受限或失败的观测会返回 nil 及原因。
Platform.range.GetRangeCheckBounds 公共读取某个单位的公开 LibRangeCheck 距离区间。成功的上限是包含的;正的失败下限是严格的。零下限是合成的。两个边界都不是精确距离,缺少上限也不能证明该单位在所有半径之外。不可用、格式错误、受限或失败的观测会返回 nil 及原因。
Platform.role.GetInspectRoleObservation 公共在探测或受限策略客户端上观测所选单位的职责,不发出观察请求。已知单位不存在时返回 false。优先使用可调用的现代观察 API,仅当它不可调用时才回退到旧版;所选 API 失败时绝不会回退。要求专精 ID 为正的有限整数,并且只使用确切的单参数 GetSpecializationInfoByID 调用的第五个返回值(职责)。所需信息缺失、失败、受限或格式错误时为不可用;可读的非空未来职责字符串保持原样。
Platform.role.GetTalentGroupRoleObservation 公共在探测或受限策略客户端上,观测确切的旧版 GetTalentGroupRole(group) 点号调用的第一个职责结果。将可读的所选天赋组原样转发,包括将 nil 作为一个参数;不推断天赋组范围、不替换为其他 API,也不查询玩家单位。完整的旧版主要声明并未成立。职责数据缺失、失败、受限、为空或格式错误时为不可用;可读的非空未来字符串保持原样。
Platform.role.readField 依赖项Reads object[key] in protected mode, used to look up optional APIs.
Platform.role.roleValue 依赖项Validates a role returned by a native API.
Platform.roster_class.GetRosterClassObservation 公共在已识别的客户端系列上读取公开的名单身份。输入路由仅限 player、party1 到 party4,以及 raid1 到 raid40。先以该确切的单参数标识调用 UnitExists;已知为 false 时直接返回 false,不查询职业。对于存在的单位,只使用 UnitClass 的第二个返回值作为可读的非空职业文件名字符串,不限制职业枚举。所需信息缺失、失败、格式错误或受限时返回 nil 及原因。
Platform.roster_class.rosterUnit 依赖项Returns true when unit is exactly player, party1 through party4, or raid1 through raid40 (no leading zeros), and false for any other string.
Platform.rotation_owner.GetPlayerOwnerClassObservation 公共为循环所有权读取一次全新的受保护 UnitClass 玩家观测。只使用第二个返回值中可读的非空职业文件名。不会添加存在性、等级、载具、客户端系列或战斗策略的读取,结果也不会跨调用保留。核心所有权仍会分别验证职业标识和角色键;被覆盖的上下文提供者保留其完整的原有路径。
Platform.runes.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.runes.GetRuneCooldownObservation 公共为一个确切的原生栏位读取一次受保护的 GetRuneCooldown 元组。分别规范化 ready、start 和 duration:ready 需要可读的布尔值,而每个时间值需要可读的有限数字,并保留带符号、小数和零值。每个不可用的字段都附带其自己的原因。成功返回空元组时会产生部分记录;缺少能力、策略或原生调用失败时返回 nil。绝不从计时推断 ready,也不从 ready 推断计时。请在调用方缓存这份完整记录,以便在符文计数和冷却判断之间共享一次观测。
Platform.runes.GetRuneEvaluationTime 公共为符文冷却运算读取一次全新的受保护无参数 GetTime。要求结果可读且为有限数字。此观测刻意不缓存;调用方保留原有的“先读时钟再扫描”顺序,并且只在有匹配的符文需要计时时才要求其值。不会以评估开始时间替代或推断时间。
Platform.runes.GetRuneTypeObservation 公共使用只带单个索引参数的 GetRuneType 观测一个确切的原生符文栏位。要求类型可读且为正的有限整数;已知的未来数字类型与所选类型保持区分,死亡符文是一个确切的类型而不是通配符。缺失、失败、受限或格式错误的观测保持为不可用。不会添加职业、单位、数量或推断基础符文的查询。
Platform.runes.numberField 依赖项Normalizes one numeric field of a native result.
Platform.runes.validIndex 依赖项Validates a rune slot index.
Platform.spells.cooldownFlags 依赖项Extracts the never-secret isEnabled, isActive and isOnGCD flags from a C_Spell.GetSpellCooldown record whose times are secret.
Platform.spells.cooldownValues 依赖项Reads a spell cooldown as separate values for the readiness checks.
Platform.spells.copy 依赖项Copies the expected fields of a native result table into a new table, checking each type.
Platform.spells.finiteNonNegative 依赖项Returns true when value is a nonnegative number that is not NaN or infinity, and false for anything else.
Platform.spells.flagReadiness 依赖项Decides cooldown readiness from the never-secret flags when the cooldown times are hidden.
Platform.spells.gcdRunning 依赖项Reports whether the global cooldown is running at time now.
Platform.spells.GetSpellCharges 公共读取规范化的充能记录:currentCharges、maxCharges、cooldownStartTime、cooldownDuration、chargeModRate 和 isActive。不受支持的法术或受限的客户端数据会返回 nil 及原因。
Platform.spells.GetSpellCooldown 公共读取各受支持客户端的法术冷却并将其规范化。返回的记录包含 startTime、duration、isEnabled 和 modRate。时间戳和持续时间已经以 GetTime() 秒数描述到期时间;不要再除以 modRate。当客户端隐藏时间时(正式服和永久服的战斗中),记录为 nil,原因为 restricted-value,在可以读取时其后会附上永不为机密的 isEnabled、isActive 和 isOnGCD 标志。
Platform.spells.identifier 依赖项Validates a spell argument.
Platform.spells.IsAutoRepeatActive 公共读取玩家某个法术(例如射击或自动射击)的自动重复状态。这与当前或排队中的施法不同。现代客户端会收到确切的法术 ID;旧版查询会先解析玩家的法术书栏位。受限的客户端策略、无法读取的结果以及不可用的法术书栏位会返回 nil 及原因。这只观测状态,从不开始或停止法术。
Platform.spells.IsSpellReady 公共检查某个法术现在能否被推荐,允许剩余冷却时间随当前公共冷却一同结束的法术。在正式服和永久服中,战斗中的冷却时间是机密值,因此改为根据永不为机密的 isEnabled、isActive 和 isOnGCD 标志判断是否就绪。此函数只检查冷却是否就绪;不检查是否已学会、距离或资源是否足够。请传入来自 evalStart 或 GetTime() 的评估时间。
Platform.spells.own 依赖项Returns a record holding only the expected fields, each checked by type.
Platform.threat.GetUnitThreatObservation 公共依次观测所选单位是否存在、是否与玩家敌对,然后观测玩家在该单位上的仇恨状态。已知不存在、非敌人以及成功读取到的 nil 仇恨状态返回 false,以保留“无仇恨”判断。包括零在内的有限状态数值保留其原有的比较含义。所需信息缺失、失败、为 nil、受限或格式错误时返回 nil 及原因。不会添加可攻击、死亡、战斗或载具的推断。
Platform.unit_attackability.GetUnitAttackabilityObservation 公共使用确切的 UnitExists、UnitCanAttack 和 UnitIsDead 判断,观测玩家是否可以攻击一个未死亡的所选单位。已知不存在或可读的不可攻击结果会返回 false,不查询死亡状态。所需观测缺失、失败、受限或格式错误时返回 nil 及原因。这不检测灵魂状态、距离、敌对状态或技能可用性,也不重定向单位所有权。
Platform.unit_flags.GetUnitFlagObservation 公共观测一个当前的单位标记:combat 使用 UnitAffectingCombat,enemy 使用以 player 为第一个单位的 UnitIsEnemy,pvp 使用 UnitIsPVP。可读且不存在的单位返回 false,不查询该标记。所需观测缺失、失败、受限或格式错误时返回 nil 及原因。这会保留确切的所选单位,不推断友好、可攻击或其他单位状态。
Platform.unit_health.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.unit_health.GetUnitHealthObservation 公共在受支持的客户端上观测可读的当前生命值,并可选地观测最大生命值。可读且不存在的单位返回 exists=false。缺失、失败、受限或格式错误的观测会返回 nil 及原因;它们不能证明单位不存在或得出生命值。
Platform.unit_identity.GetUnitIdentityObservation 公共只用 UnitExists 检查第一个单位标识后,使用 UnitIsUnit 比较两个确切的单位标识。若第一个单位可读且不存在,则不进行比较直接返回 false。所需的观测缺失、失败、受限或格式错误时返回 nil 及原因。不会额外进行第二次存在性查询、GUID 查找或推断身份。
Platform.unit_level.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.unit_level.GetUnitLevelObservation 公共在已知的客户端上观测可读的原始单位等级。可读且不存在的单位返回 exists=false;存在的单位要求 UnitLevel 为正的有限整数。未知的首领等级,以及缺失、失败、受限或格式错误的观测会返回 nil 及原因。这不使用有效等级或缩放后的等级。
Platform.unit_metadata.GetUnitMetadataObservation 公共在检查 UnitExists 后观测一个所使用的原生单位元数据字段:class 使用 UnitClass 的第二个返回值,creature 使用本地化的 UnitCreatureType 名称,classification 使用 UnitClassification。可读且不存在的单位返回 false,不查询元数据。未使用的元组字段不影响可用性;所需的值缺失、失败、为 nil、受限或格式错误时返回 nil 及原因。不会添加玩家职业、GUID、枚举或翻译推断。
Platform.unit_power.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.unit_power.GetUnitPowerObservation 公共在受支持且可读的客户端上观测显式的法力值或当前的原始能量资源。资源身份从实时的 PowerType 枚举中选择;显式法力值绝不会回退到当前能量条。已知不存在时返回 exists=false;缺失、失败、受限或格式错误的观测会返回 nil 及原因。current 模式下的数量保留带符号的原生资源;显式法力值为非负。仅在需要时请求最大值;百分比的使用者必须要求最大值为正。
Platform.unit_presence.GetUnitPresenceObservation 公共在已识别的客户端系列上观测单位的存在性。将所选单位原样传给一次受保护的 UnitExists 调用。保留可读的 true 和 false;所需观测缺失、失败、受限、为 nil 或格式错误时返回 nil 及原因。不会添加身份、可见性、距离或战斗状态的查询。
Platform.unit_stat.finite 依赖项Returns true when value is a number that is neither NaN nor infinite, and false for anything else.
Platform.unit_stat.GetUnitStatObservation 公共只从原生的第二个返回值观测有效属性。在探测或受限策略客户端上,先查询确切的 UnitExists(unit),然后对选择器 1..5 查询 UnitStat(unit,stat),或对选择器 6 查询 UnitArmor(unit)。已知不存在时返回 exists=false;所需信息缺失、失败、受限或非有限时返回 nil。保留有限的带符号、小数和零值;忽略所有未使用的元组字段。1..6 的路由是 RM 的选择器策略,而非原生值域的限制。
Platform.unit_states.GetUnitStateObservation 公共在探测或受限策略客户端上,观测确切的所选单位是否死亡或处于灵魂状态,或是否对玩家友好。所需观测缺失、失败、受限或格式错误时为不可用。单位不存在时为不可用,而不是否定匹配,在 NOT 下同样如此。不会保留跨轮询的状态。
Platform.zone_pvp.GetZonePVPObservation 公共使用一次受保护的无参数点号调用,观测区域 PvP 分类的第一个结果。优先使用可调用的 C_PvP.GetZonePVPInfo,仅当现代 API 不可调用时才使用全局辅助函数。成功返回 nil 或没有返回值时,会产生一个已知的空记录;缺失、失败、受限或格式错误的观测保持为不可用。可读的空字符串和未来字符串保留其确切含义,未使用的返回字段不决定可用性。在现代 API 返回结果或失败后,绝不切换后端。