diff --git a/Obsidian/20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数.md b/Obsidian/20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数.md index 6e810f65..a2148c69 100644 --- a/Obsidian/20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数.md +++ b/Obsidian/20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数.md @@ -1,6 +1,6 @@ --- title: Fuyutsui 目标焦点与敌人数 -summary: 说明目标/焦点的类型、距离、生命和施法状态,以及姓名板驱动的敌人数与仇恨统计。 +summary: 说明目标/焦点的单位类型、驱散类型、距离、生命和施法状态,以及姓名板驱动的敌人数与仇恨统计。 aliases: - Fuyutsui Target Focus - Fuyutsui 敌人数 @@ -21,6 +21,8 @@ related: source_files: - Fuyutsui/core/target.lua - Fuyutsui/core/stateblocks.lua + - Fuyutsui/core/block.lua + - Fuyutsui/core/spells.lua - Fuyutsui/core/events.lua - Fuyutsui/core/core.lua source_symbols: @@ -28,9 +30,11 @@ source_symbols: - Fuyutsui:UpdateUnitFullInfo - Fuyutsui:UpdateUnitType - Fuyutsui:UpdateUnitRangeBlock + - GetUnitDispelStateIndex + - AddUnitDispelSlots - Fuyutsui:AddNameplate - Fuyutsui:UpdateEnemyCount -verified_at: 2026-08-09 +verified_at: 2026-08-19 --- # Fuyutsui 目标焦点与敌人数 @@ -41,18 +45,19 @@ verified_at: 2026-08-09 ## AI 快速摘要 -> `core/target.lua` 为 `target` 和 `focus` 分别维护缓存,输出类型、可攻击/协助、距离、死亡、生命和施法状态。姓名板事件维护另一张敌人缓存,0.2 秒轮询距离与战斗状态后输出总敌人数,并在仇恨事件中拆分有/无仇恨数量。目标/焦点状态使用带分类前缀的键,不与玩家裸状态键冲突。 +> `core/target.lua` 为 `target` 和 `focus` 分别维护缓存,输出类型、距离、死亡、生命和施法状态;`core/block.lua` 的 AuraContainer 写入与类型相邻的目标/焦点驱散类型槽。类型值通过 `UnitIsUnit()` 识别实际对应的 raid/player/party/boss 单位,友方在基础编号上加 100;驱散类型则按当前可处理光环的类别输出固定编号。姓名板事件维护另一张敌人缓存,0.2 秒轮询距离与战斗状态后输出总敌人数,并在仇恨事件中拆分有/无仇恨数量。 ## 范围与非范围 -本页覆盖单位快照与姓名板聚合,不覆盖目标/焦点光环的筛选与持续时间,后者见 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]]。队伍距离和治疗范围见 [[20-Fuyutsui/07-Fuyutsui-队伍与治疗吸收]]。 +本页覆盖单位快照、目标/焦点类型与驱散类型编码,以及姓名板聚合。驱散类型在这里只记录字段关系和生产契约;AuraContainer 的完整过滤、布局和生命周期见 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]]。队伍距离和治疗范围见 [[20-Fuyutsui/07-Fuyutsui-队伍与治疗吸收]]。 ## 输入与输出 | 输入 | 缓存/计算 | 输出字段族 | |---|---|---| | `target`、`focus` 单位 API | `Fuyutsui.target`、`Fuyutsui.focus` | 类型、距离、生命、施法/引导、可打断 | -| LibRangeCheck | `minRange`、`maxRange`、`inRange` | 目标/焦点距离与类型中的范围位 | +| AuraContainer + 当前驱散能力 | 目标/焦点友方 HARMFUL、敌方 HELPFUL 驱散槽 | 目标驱散类型、焦点驱散类型 | +| LibRangeCheck | `minRange`、`maxRange`、`inRange` | 目标/焦点距离 | | 姓名板增删事件 | `Fuyutsui.nameplate[unit]` | 当前可计数单位集合 | | 仇恨和战斗 API | `threatStatus`、`affectingCombat` | 敌人数、有仇恨、无仇恨 | | 地图/遭遇状态 | 特例过滤 | 是否把特定单位计入聚合 | @@ -96,15 +101,48 @@ NAME_PLATE_UNIT_REMOVED -> 从缓存删除 ``` -## 单位类型编码 +## 目标/焦点类型与驱散类型 -`UpdateUnitType()` 根据死亡、敌友关系、驱散能力和范围计算离散值: +这两组字段在状态布局中分别成对出现,但编码含义彼此独立: -- 不存在、死亡或无法分类时为 0。 -- 可攻击敌对单位以 `1/255` 为基础;具体驱散/范围信息由 `target.enemyCurve` 编入。 -- 可协助友方单位以 `11/255` 为基础;可驱散类型由 `target.friendCurve` 编入。 +| 目标字段 | 焦点字段 | 数据来源 | 含义 | +|---|---|---|---| +| `目标类型` | `焦点类型` | `UpdateUnitType()` | 单位 token 编号,并以 `+100` 区分友方 | +| `目标驱散类型` | `焦点驱散类型` | AuraContainer dispel 槽 | 当前可处理光环的驱散类别 | -这些曲线在 `UpdateSpellKnown()` 中按当前角色实际驱散能力重建,因此目标“类型”同时依赖法术已知状态;它不是单纯的敌友布尔值。 +### 类型编码 + +`UpdateUnitType()` 先通过 `UnitIsUnit(unit1, unit2)` 判断 `target` 或 `focus` 实际对应的单位 token,再编码为 `index/255`。匹配按 raid、player、party、boss 的顺序执行;全部不匹配时使用“其他”编号。不存在或死亡的单位输出 0。 + +| 实际单位 | 基础 index | 非友方/敌方输出 | 友方 index(基础值 + 100) | 友方输出 | +|---|---:|---:|---:|---:| +| `raid1..raid40` | 1..40 | `1..40 / 255` | 101..140 | `101..140 / 255` | +| `player` | 41 | `41 / 255` | 141 | `141 / 255` | +| `party1..party4` | 42..45 | `42..45 / 255` | 142..145 | `142..145 / 255` | +| `boss1..boss5` | 46..50 | `46..50 / 255` | 146..150 | `146..150 / 255` | +| 其他 | 51 | `51 / 255` | 151 | `151 / 255` | + +友方判定直接使用 `UnitCanAssist("player", unit)`;类型值不再包含距离、驱散能力或法术已知状态。由于 raid 优先匹配,玩家或队友处于团队中时输出对应的 raid 编号,而不是 player/party 编号。 + +### 驱散类型编码 + +`目标驱散类型` 与 `焦点驱散类型` 的普通状态 getter 固定返回 0;实际颜色由 AuraContainer 直接覆盖对应像素。`GetUnitDispelStateIndex()` 找到这两个状态槽,`AddUnitDispelSlots()` 为每个单位各建立两条互斥链路: + +- 友方单位读取 `HARMFUL` 光环,只启用玩家当前 `includeDispelTypes` 能处理的防御驱散类型。 +- 敌方单位读取 `HELPFUL` 光环,只启用玩家当前 `includeOffensiveDispelTypes` 能处理的进攻驱散类型。 +- 没有匹配光环、单位反应不符或玩家无对应驱散能力时保持 0。 +- 多个候选按到期时间排序;像素表达被选中光环的驱散类别,不表达剩余时间。 + +| 驱散类别 | index | 输出 | +|---|---:|---:| +| Magic | 1 | `1 / 255` | +| Curse | 2 | `2 / 255` | +| Disease | 3 | `3 / 255` | +| Poison | 4 | `4 / 255` | +| Enrage | 9 | `9 / 255` | +| Bleed | 11 | `11 / 255` | + +两类输出不能混读:例如 `1/255` 在“类型”槽表示 `raid1`,在“驱散类型”槽表示 Magic。目标与焦点使用相同编码表,区别仅由各自的状态槽位置决定。 ## 距离、生命与施法 @@ -129,15 +167,18 @@ NAME_PLATE_UNIT_REMOVED - `GetUnitCache()` 当前只为 `target` 和 `focus` 返回缓存;虽然 `unitZHMap` 列出 `boss1..boss5`,这些 boss token 目前不会进入该通用更新链。 - 状态键为 `目标类型`、`焦点类型` 这类“分类+名称”组合,必须与 `LoadPlayerBlocks()` 完全一致。 -- 类型曲线必须在角色法术已知状态改变后重建,否则驱散能力位会过时。 +- 单位身份比较统一经过 `isSameUnit()`,其内部先保存 `local isSame = UnitIsUnit(unit1, unit2)` 再返回结果。 +- raid 必须先于 player/party 匹配;否则同一团队成员可能被编码到不同编号空间。 +- 类型槽与驱散类型槽必须按各自字段解释;相同蓝通道值不代表相同业务语义。 +- 驱散类型槽由 AuraContainer 覆盖,普通 getter 必须保持 0,避免无匹配光环时残留旧值。 - 姓名板缓存必须在移除事件删除;否则单位 token 重用会污染计数。 - 敌人数除以 255,消费端不能把 `B` 直接当原始整数。 ## 失败模式与当前风险 -1. **初始类型可能长期使用空缓存字段。** `UpdatePlayerBlocks()` 调用目标/焦点类型、距离和生命更新,但没有先调用 `UpdateUnitCanAttack()`;若启用时已有单位且未再触发 target/focus change,类型可能保持 0。 -2. **距离未知时像素陈旧。** LibRangeCheck 可返回 `nil`;getter/更新器没有为所有未知分支强制写哨兵,旧距离像素可能保留。 -3. **boss 映射是未完成入口。** `unitZHMap` 有 `boss1..5`,但 `GetUnitCache()` 不支持它们;仅增加事件调用不会产生输出。 +1. **距离未知时像素陈旧。** LibRangeCheck 可返回 `nil`;getter/更新器没有为所有未知分支强制写哨兵,旧距离像素可能保留。 +2. **boss 缓存仍不是独立入口。** 目标/焦点类型可以识别其是否与 `boss1..boss5` 相同,但 `GetUnitCache()` 仍只支持 `target` 和 `focus`;不能据此直接为 boss token 刷新完整状态。 +3. **驱散能力可能过时。** 学会、遗忘技能或切换专精后若未运行 `UpdateSpellKnown()`,目标/焦点驱散槽仍会使用旧的能力集合。 4. **姓名板覆盖不完整。** 未显示姓名板、客户端未创建或刚被移除的敌人不会计数。 5. **硬编码副本规则会过时。** `testMap`/`testEncounter` 需要随版本验证,不能泛化为所有副本。 6. **受保护值。** 新版 WoW 的 secret value 若被直接比较、索引或打印会报错;新增单位逻辑需沿用安全检查策略。 @@ -145,19 +186,22 @@ NAME_PLATE_UNIT_REMOVED ## 修改影响 - 增加 boss 单位支持需同时新增缓存、状态声明、事件入口和 C# 配置字段。 -- 更改类型枚举或驱散曲线时同步 [[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]] 与 Shigure 的业务判断。 +- 更改类型编号、匹配优先级或友方偏移时同步 Shigure 的业务判断。 +- 更改驱散类型编号或过滤能力时同步 [[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]]、[[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]] 与 Shigure 的业务判断。 - 更改敌人数口径时记录地图、战斗和范围边界;它会直接改变 AoE/目标选择策略。 - 更改目标/焦点字段名或顺序需重新生成配置,遵循 [[40-跨项目/02-Shigure-ClassBlocks到config同步契约]]。 ## 源码索引 -- `Fuyutsui/core/target.lua:10-38`:距离 API、单位名映射、缓存和类型基础值。 -- `Fuyutsui/core/target.lua:40-114`:类型、射程、施法、死亡和生命通用更新。 -- `Fuyutsui/core/target.lua:116-164`:target/focus 包装入口。 -- `Fuyutsui/core/target.lua:166-234`:姓名板缓存、仇恨与敌人数。 -- `Fuyutsui/core/stateblocks.lua:229-253`:目标/焦点 getter。 +- `Fuyutsui/core/target.lua:10-69`:距离 API、单位名映射、缓存、单位身份匹配和类型编码。 +- `Fuyutsui/core/target.lua:71-145`:类型、射程、施法、死亡和生命通用更新。 +- `Fuyutsui/core/target.lua:148-195`:target/focus 包装入口。 +- `Fuyutsui/core/target.lua:197-265`:姓名板缓存、仇恨与敌人数。 +- `Fuyutsui/core/stateblocks.lua:235-261`:目标/焦点类型、驱散类型及其他 getter。 +- `Fuyutsui/core/block.lua:738-807,907-947`:目标/焦点驱散过滤、颜色编号与槽创建。 +- `Fuyutsui/core/spells.lua:152-207`:防御/进攻驱散类型名称和当前能力集合。 - `Fuyutsui/core/events.lua:204-250,361-389,425-435`:相关事件与 0.2 秒轮询。 ## 知识图谱 -本页由 [[20-Fuyutsui/02-Fuyutsui-事件与刷新调度]] 驱动,通过 [[20-Fuyutsui/03-Fuyutsui-状态块与编码入口]] 输出单位像素;类型曲线依赖 [[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]] 的驱散能力,目标/焦点光环由 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]] 补充。 +本页由 [[20-Fuyutsui/02-Fuyutsui-事件与刷新调度]] 驱动,通过 [[20-Fuyutsui/03-Fuyutsui-状态块与编码入口]] 输出单位像素;目标/焦点驱散能力来自 [[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]],AuraContainer 写入机制见 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]]。 diff --git a/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md b/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md index d51a81ae..c5e3db46 100644 --- a/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md +++ b/Obsidian/20-Fuyutsui/06-Fuyutsui-法术与物品冷却.md @@ -33,7 +33,7 @@ source_symbols: - Fuyutsui:UpdateItemCooldown - Fuyutsui:CreateAutoLayoutBar - Fuyutsui.spellsList -verified_at: 2026-08-09 +verified_at: 2026-08-19 --- # Fuyutsui 法术与物品冷却 @@ -69,7 +69,7 @@ verified_at: 2026-08-09 | 法术书/天赋状态 | 已知法术筛选、`forcedKnown`/`inSpellBook` 例外 | 可更新集合;未知法术写 255 | | Cooldown/Charge Duration | 经 `curve255` 求剩余时间颜色 | `B=0..255` | | `castCount`、`maxCharge` | CountBars 自动布局 | 横向计数条 | -| 已知驱散法术 | 构建友方/敌方类型曲线与光环驱散过滤 | 目标类型、队伍驱散槽 | +| 已知驱散法术 | 构建驱散能力、旧友方/敌方曲线与光环驱散过滤 | 队伍及目标/焦点驱散槽;旧曲线当前不参与单位类型输出 | | 物品数量/冷却 API | 状态 getter 读取 | 药水、治疗石等物品状态 | ## 执行链路 @@ -80,7 +80,7 @@ verified_at: 2026-08-09 -> blocks.spells 过滤到本地 spells -> 未知项主槽/充能槽写 255 -> 计算 defensive/offensive dispel 能力 - -> 重建目标类型曲线和 AuraContainer dispel 过滤 + -> 重建旧友方/敌方曲线和 AuraContainer dispel 过滤 每 0.2 秒 -> UpdateSpellCooldown() @@ -119,9 +119,9 @@ verified_at: 2026-08-09 - `dispelCapabilities`、`offensiveDispelCapabilities`。 - `includeDispelTypes`,供队伍 AuraContainer 过滤。 -- `dispelCurve`、`target.friendCurve`、`target.enemyCurve`,把驱散类别叠入单位类型像素。 +- `dispelCurve`、`target.friendCurve`、`target.enemyCurve`。其中 friend/enemy 曲线仍会重建,但当前 `UpdateUnitType()` 已改为单位 token 编号,不再读取它们。 -这解释了法术学习变化为何会影响 [[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数]] 和 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]]。 +因此法术学习变化会影响 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]] 的驱散过滤,但不会改变 [[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数]] 的目标/焦点类型编号。 ## 横向技能条 @@ -160,7 +160,7 @@ ItemID 是版本敏感数据;新增同类物品必须更新聚合列表和相 - 修改职业 `spells` 后必须执行 ClassBlocks→config 同步,见 [[40-跨项目/02-Shigure-ClassBlocks到config同步契约]]。 - 修改冷却哨兵、曲线或 GCD 规则时同步 Shigure 的状态判断和测试。 - 修改横向条预留/终点布局时同步 [[30-Shigure/02-Shigure-像素扫描与协议解码]]。 -- 增加驱散类型或能力表时同时检查目标类型曲线、队伍 dispel 槽和 AuraContainer 过滤。 +- 增加驱散类型或能力表时同时检查旧友方/敌方曲线、队伍 dispel 槽和 AuraContainer 过滤;不要假定旧曲线仍参与目标/焦点类型输出。 - 在合入职业表前自动检查“当前专精 SpellID 唯一”和“导出字段名唯一”。 ## 源码索引 @@ -175,4 +175,4 @@ ItemID 是版本敏感数据;新增同类物品必须更新聚合列表和相 ## 知识图谱 -本页使用 [[20-Fuyutsui/03-Fuyutsui-状态块与编码入口]] 的主行与 CountBars,向 [[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数]] 提供类型曲线、向 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]] 提供驱散过滤;其配置同步边界由 [[40-跨项目/02-Shigure-ClassBlocks到config同步契约]] 管理。 +本页使用 [[20-Fuyutsui/03-Fuyutsui-状态块与编码入口]] 的主行与 CountBars,并向 [[20-Fuyutsui/08-Fuyutsui-光环容器本地集成]] 提供驱散过滤;目标/焦点类型编号由 [[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数]] 独立定义,其配置同步边界由 [[40-跨项目/02-Shigure-ClassBlocks到config同步契约]] 管理。 diff --git a/Obsidian/20-Fuyutsui/08-Fuyutsui-光环容器本地集成.md b/Obsidian/20-Fuyutsui/08-Fuyutsui-光环容器本地集成.md index 8f7abe48..e726dc80 100644 --- a/Obsidian/20-Fuyutsui/08-Fuyutsui-光环容器本地集成.md +++ b/Obsidian/20-Fuyutsui/08-Fuyutsui-光环容器本地集成.md @@ -1,6 +1,6 @@ --- title: Fuyutsui 光环容器本地集成 -summary: 说明当前直接位于 core/block.lua 的 Blizzard AuraContainer 集成、持续/永久槽配对、反应过滤、层数条和队伍光环。 +summary: 说明当前直接位于 core/block.lua 的 Blizzard AuraContainer 集成、持续/永久槽配对、目标/焦点驱散槽、反应过滤、层数条和队伍光环。 aliases: - Fuyutsui AuraContainer - Fuyutsui 光环槽 @@ -16,6 +16,7 @@ up: - "[[20-Fuyutsui/00-Fuyutsui-MOC]]" related: - "[[50-参考资料/AuraContainer_AI_Reference_zh-CN]]" + - "[[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数]]" - "[[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]]" - "[[20-Fuyutsui/07-Fuyutsui-队伍与治疗吸收]]" source_files: @@ -26,18 +27,20 @@ source_files: source_symbols: - EnsureAuraContainerLoaded - AddDurationAuraSlotPair + - GetUnitDispelStateIndex + - AddUnitDispelSlots - Fuyutsui:RefreshUnitAuraContainers - Fuyutsui:LayoutAuraApplicationBars - Fuyutsui:RefreshGroupAuraContainers - Fuyutsui:RebindAuraSpellFilters -verified_at: 2026-08-09 +verified_at: 2026-08-19 --- # Fuyutsui 光环容器本地集成 上级:[[20-Fuyutsui/00-Fuyutsui-MOC]] -相关:[[50-参考资料/AuraContainer_AI_Reference_zh-CN]] · [[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]] · [[20-Fuyutsui/07-Fuyutsui-队伍与治疗吸收]] +相关:[[50-参考资料/AuraContainer_AI_Reference_zh-CN]] · [[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数]] · [[20-Fuyutsui/06-Fuyutsui-法术与物品冷却]] · [[20-Fuyutsui/07-Fuyutsui-队伍与治疗吸收]] ## AI 快速摘要 @@ -63,6 +66,7 @@ verified_at: 2026-08-09 |---|---|---| | `ClassBlocks.auras.player` | 玩家 AuraContainer 槽对 | 顶部持续/永久光环像素 | | target/focus harmful/helpful | 对应单位容器及反应过滤 | 顶部目标/焦点光环像素 | +| `目标驱散类型`、`焦点驱散类型` + 当前驱散能力 | 每单位友方 HARMFUL/敌方 HELPFUL dispel 槽 | 固定驱散类型色;编码与目标/焦点类型并列记录在目标专题 | | 玩家光环 `maxApps` | 额外应用层数 StatusBar | `FuyutsuiCountBars` | | `group.aura[offset]` | 每成员 `HELPFUL|PLAYER` 槽 | 成员块中的持续/永久像素 | | `group.dispel` + 当前驱散能力 | 每成员 HARMFUL dispel 槽 | 成员块中的固定驱散类型色 | @@ -120,6 +124,8 @@ WoW 在敌对单位上处理 `HELPFUL`、友方单位上处理 `HARMFUL` 时,S 这套顺序用于避免槽错误落到单位的“第一个任意光环”。 +同一单位容器还会通过 `GetUnitDispelStateIndex()` 定位 `目标驱散类型` 或 `焦点驱散类型` 状态槽,并按友方 HARMFUL、敌方 HELPFUL 两条链路写入固定驱散类别。字段关系和完整编号表统一见 [[20-Fuyutsui/05-Fuyutsui-目标焦点与敌人数#目标/焦点类型与驱散类型]];本页只说明 AuraContainer 实现。 + ## 玩家应用层数条 只有 `maxApps` 的玩家光环会生成层数条: