ViLoot.txt (v1.2.8) 深度技术审计与改进建议报告(附完整 PDF 报告) #1

Open
opened 2026-10-28 08:26:39 +00:00 by troytt · 0 comments

📎 完整排版 PDF 审计报告附件


📌 核心结论与审计基准

  • 审计基准:ViLoot.txt (v1.2.8, commit 1a84a315c4),共 6,824 行、743,121 字节(解析出 326 条 Alias、13 条 Formula、4,366 条 ItemDisplay 规则)。
  • 验证真值(Ground Truth):严格对齐 ZYLPD2 S14 客户端 BH.dll 机器码反汇编(ItemDisplay::Initialize 0x1016f8c0、BuildConditionAST 0x101718f0、ConvertToRPN 0x10172e90、Condition::Parse 0x101730c0、Action::Parse 0x10171da0、CompileActionTokens 0x10163000)与 pd2data.mpq 数据表,零臆测、零误报。
  • 核心结论:ViLoot.txt 在手工/稀有装备多维打分、地图词缀摘要与排版视觉体系上设计丰富,但存在 7 类 P0 级引擎底层解析缺陷——包括 Alias 前缀子串覆盖摧毁 3 个面板开关与 5 条底材规则、单遍 Alias 反向引用失效导致未鉴定 3★ 头环规则 (GOODCIRC) 100% 报废、[NIMA] 底材总表 5 大职业全部误粘贴为刺客公式 (FORMULAASNSK)、括号失配导致 L6751 整条规则死亡与 GOODBASE 逃逸污染,以及 T1~T3 地图评分非法 >= 比较符被静默丢弃。

一、量化缺陷总览(按严重度分级)

优先级 缺陷类别 数量 核心影响面摘要
P0 阻断 Alias 前缀子串覆盖污染(无词界匹配) 3 组别名 ➔ 篡改 5 条规则 L94..98 的 AMACRAFT/BARCRAFT/ASNCRAFT 定义在 L128..130 的 SHOW_*CRAFT 之前,将 SHOW_AMACRAFT 撕裂为 SHOW_(am7 OR amc),导致大院长弓对全职业强行无视开关开启,而有形刺客爪/野蛮人投掷底材在 L6786/L6788 下被泄露的 ETH 彻底误杀!
P0 阻断 单遍 Alias 反向引用永不展开(沦为恒假 FalseCondition) 2 条核心别名 ➔ 瘫痪 5 条规则 L5455 GOODCIRC 引用前序 L5180..5186 的 SKAMA..SKASN,7 大职业技能别名全部未展开并编译为 FalseCondition,L5456 与 L5527 未鉴定亮金职业头环规则 100% 恒假报废;L3914 CORR_SM3 引用 L131 IS_SOE 同样失效。
P0 阻断 括号失配导致整条规则死亡与条件逃逸污染 2 处 ➔ 破坏 3 条规则 L6751 德鲁伊狼头底材少 1 个 ) 致 BuildConditionAST 失败(root_idx = 0xffffffff 整条永久死亡);L91 GOODBASE 中段 ELT) 提前闭合外层括号,前半段普通/扩展级底材被 ELT 误杀,后半段逃逸出 NMAG !RW 把黄/蓝/暗金/符文之语误标为“符文之语底材”。
P0 阻断 [NIMA] 符文之语底材总表复制粘贴灾难 5 条规则 (L6808..6816) 野蛮人、德鲁伊、死灵法师、圣骑士、法师 5 大职业底材保底规则全部原样复制���刺客 FORMULAASNSK,导致这 5 大职业高技能白板底材失去保底,在 20 级后或 FILTLVL>=3 下直接跌入 L6824 JUNKITEM 被静默屏蔽!
P0 高危 非法 >= 条件运算符被 Condition::Parse 静默丢弃 6 条规则(共 10 处) L859、L877、L895(T1~T3 地图 A 级评分)6 处 >=4 被静默丢弃,低分地图(0~3 分)误标橙色 A 级;L4248..4250 4 处 SOCKETS>=2 同样被静默丢弃。
P0 高危 词法粘连与 AND/OR 等优先级逻辑反转 9 条规则 L5560 GOODSOR 中 PREFIX=453 ORPREFIX=968 粘连插入隐式 AND FALSE,火/电/冰三大单系法杖/法珠前缀全灭;L332..338 7 种无瑕宝石在地面不显示配方、放进背包却无视开关强行刷屏。
P1 严重 未注册动作宏拼写错误与 % 跨 { 奇偶错位 2 条规则 L3577 误将 %TIPRTS% 写为 %PTRLTS%,悬浮窗原样输出字面量 "%PTRLTS%";L183 小紫瓶 35%{%PURPLE%r 触发加载期正则错位,将 {...} 内小写 r 原地篡改为大写 R(R35%+)。
P2 中危 中段残留 UTF-8 BOM、无效物品代码与 {...} 吞属性 2 处 BOM + 42 条规则 + 22 条悬浮窗 L1251、L4430 混入隐形 BOM (U+FEFF);cm4(33 条)与 tm1i..tm9i(99 次展开)在标准 S14 中不存在;L360 红白珠与 L381..394 全系彩虹刻面暗金珠宝在背包内悬停时原版词缀属性被彻底抹除!
P3 / P4 大小写混写宏、幽灵开关与 4,366 条规则性能优化 14 处宏 + 1 开关 + 架构 14 处 %gray%/%Orange%/%Coral%/%Red% 依赖加载期正则兜底;L133 IS_XXX 0 引用;743 KB / 4,366 条规则每帧线性扫描开销比同类过滤器高约 70%。

二、P0 级引擎底层解析缺陷深度剖析(BH.dll 机器码实证)

2.1 Alias 前缀子串无词界覆盖:AMACRAFT / BARCRAFT / ASNCRAFT 摧毁面板开关与 5 条规则

在 BH.dll 的 ItemDisplay::Initialize (0x101708ac..0x10170cc9) 中,引擎对每条 ItemDisplay 条件串按 Alias 在文件中的定义行号从前向后单遍执行 std::wstring::find 原文子串替换(不检查单词边界)。

在 ViLoot.txt 中,底材集合别名定义在 L94..98,而对应的 BH 面板开关却定义在后方的 L128..130:

  • L94 Alias[AMACRAFT]: (am7 OR amc) ➔ 先于 L128 Alias[SHOW_AMACRAFT]: FALSE 执行!
  • L96 Alias[BARCRAFT]: ((glv OR 9gl OR 7gl OR tsp OR 9ts OR 7ts) ETH) ➔ 先于 L129 Alias[SHOW_BARCRAFT]: FALSE 执行!
  • L98 Alias[ASNCRAFT]: ((axf OR 9xf OR 7xf) ETH) ➔ 先于 L130 Alias[SHOW_ASNCRAFT]: FALSE 执行!

图 1:BH.dll 单遍无词界 Alias 子串替换导致 ASNCRAFT 撕裂 SHOW_ASNCRAFT 链路

  • 5 条受污染规则的精确运行时后果(经 0x101730c0 ➔ 0x10178e32 ➔ 0x10172e90 指令级推演):
    1. L5099 & L6782:SHOW_AMACRAFT 被替换为 SHOW_(am7 OR amc)。SHOW_(am7 落入 0x10178e32 FalseCondition,但右侧 OR amc 对所有大院长之弓 (amc) 恒为 TRUE——即便面板开关默认 FALSE,非亚马逊职业在任何过滤等级下都会被强制显示所有未鉴定蓝/黄及白板 0 孔 amc!
    2. L6786(刺客战拳注入底材)& L6788(野蛮人投掷注入底材):SHOW_ASNCRAFT / SHOW_BARCRAFT 被撕裂后,内层右括号提前闭合了 (ASSASSIN OR FILTLVL=5 OR ...),导致末尾泄露出的 ETH 被隐式 AND 到整条规则顶层——所有有形 (!ETH) 刺客爪 (axf/9xf/7xf) 与投掷武器哪怕是刺客/野蛮人本职业或手动勾选开关也永远无法匹配!
    3. L5101(刺客手工爪):OR 9xf OR 7xf 绕过 SHOW_ASNCRAFT=FALSE,对全职业强制显示无形 9xf/7xf。
  • 修复方案:将 L116..133 的全部 SHOW_* / HIDE_* / IS_* 长名称面板开关移动到 L94 短名称底材别名之前(长名称优先展开即可彻底根除前缀覆盖)。

2.2 单遍 Alias 反向引用失效:GOODCIRC (L5455) 与 CORR_SM3 (L3914)

BH.dll 在加载 Alias[key]: val (0x1016f984) 时绝不展开 val 中的其他 Alias;在对 ItemDisplay 展开时也仅从索引 0 到 N-1 正向遍历一次。因此,后定义的 Alias 一旦在条件体中引用了先定义的 Alias,被引用项将永远无法展开:

  1. L5455 Alias[GOODCIRC]: (SKAMA OR SKSOR OR SKNEC OR SKPAL OR SKBAR OR SKDRU OR SKASN):
    • 7 大职业技能词缀别名 SKAMA..SKASN 全部定义在前方的 L5180..5186!
    • 当引擎遍历至索引对应的 L5455 将 L5456 与 L5527 中的 GOODCIRC 替换为 (SKAMA OR ... OR SKASN) 时,L5180..5186 早已遍历完毕!残留的 SKAMA..SKASN(长度均为 5 字符,非 3~4 字符物品代码)在 Condition::Parse (0x10178e32) 中全部被编译为恒假 FalseCondition!
    • 真实后果:L5456(未鉴定 3★ 亮金职业头环星标与边框通知)与 L5527(未鉴定亮金职业头环显示规则)100% 恒为 FALSE,彻底瘫痪!
  2. L3914 Alias[CORR_SM3] 引用前序 L131 IS_SOE:
    • CORR_SM3 末尾的 (IS_SOE BOOTS) 在展开进 L4248..4250 后,IS_SOE(长 6 字符)未展开并沦为 FalseCondition,即使玩家在面板中开启 IS_SOE=TRUE,鞋子腐化孔数分支也永远不生效。
  • 修复方案:在 BH.dll 单遍架构下,被引用的子 Alias 必须定义在引用它的父 Alias 之后(例如将 GOODCIRC 移至 SKAMA..SKASN 之前,或直接内联展开)。

2.3 括号失配:L6751 整条规则永久死亡与 L91 GOODBASE 条件逃逸污染

  1. L6751(极品复合技能德鲁伊狼头底材 %RW_BASE_GOOD%)少写 1 个右括号���
    ItemDisplay[DRU (((SK221>2 OR SK247>2) OR (SK221>2 AND (SK227>2 OR SK237>2)) OR (SK240>1 AND SK245>1 AND SK250>1) OR ((SK240>2 OR SK250>2) AND SK245>2) OR (SK240>2 AND (SK245>2 OR SK250>2))) !INF !ETH NMAG !RW !SOCK=1]: %RW_BASE_GOOD%{%NAME%}
    
    • DRU 后的 ((( 开启了 3 层外括号,但在 !INF 前仅闭合了 2 层(整行左括号 10 个、右括号 9 个)。ConvertToRPN (0x10172fb5) 在末尾遇到未闭合 '(' 提前中断,导致首词 DRU 与后续条件树未能通过 AND 合并,BuildConditionAST (0x10171b05) 校验 ast_stack.size() == 2 != 1 失败,将 root_idx 置为 0xffffffff——整条 L6751 规则对所有物品恒返回 false!
  2. L91 Alias[GOODBASE] 漏写左括号导致中段 ELT) 提前闭合外层括号(污染 L6803 & L6804):
    // L91 中段:OR (SK48>2 OR SK61>2 OR SK63>2 OR SK65>2) ELT) 漏了外包 '(',提前闭合了 GOODBASE 首字符 '('!
    Alias[GOODBASE]: ($f(SK221+SK222+SK247)>7 ... OR (SK48>2 OR SK61>2 OR SK63>2 OR SK65>2) ELT) OR (SK69>2 SK70>2) OR (SK79>2 SK94>2) OR (SK252>2 (SK263>2 OR SK275>2)))
    

图 2:L91 Alias[GOODBASE] 漏写左括号致中段 ELT) 提前闭合外层括号的双重污染效应

2.4 [NIMA] 底材总表复制粘贴灾难(L6805..6816):5 大职业全部误写为刺客 FORMULAASNSK

在文件末尾紧邻 JUNKITEM 垃圾底材屏蔽规则之前的 [NIMA] NMAG Items Master 总表兜底区(L6805..6816):

//Assasin
ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%}
//Barbarian
ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%}
//Druid
ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%}
//Necromancer
ItemDisplay[NMAG !RW !SOCK=1 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%}
//Paladin
ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%}
//Sorceress
ItemDisplay[NMAG !RW !SOCK=1 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%}
  • 严重后果:尽管文件已在 L2384..2389 定义好了 Formula[BARSK]、Formula[DRUSK]、Formula[NECSK]、Formula[PALSK]、Formula[SORSK],但 L6808..6816 的 5 条规则全部原封不动粘贴了 FORMULAASNSK!这导致上述 5 大职业总技能 >5 或 >8 的白板底材在 [NIMA] 区完全无法命中,一旦未被前序特定规则接住,在角色 CLVL>19 或 FILTLVL>2 时将直接跌入 L6824 (JUNKITEM) 被静默隐藏!
  • 修复方案:分别替换为对应职业的 FORMULABARSK(限定 BAR)、FORMULADRUSK(限定 DRU)、FORMULANECSK(限定 NEC OR WAND)、FORMULAPALSK(限定 DIN OR SCEPTER)、FORMULASORSK(限定 SOR OR STAFF)。

2.5 非法 >= 比较符被静默丢弃(6 条规则)与等优先级/粘连缺陷(9 条规则)

  1. 非法 >= 条件比较符被 Condition::Parse 静默丢弃(共 10 处):
    • T1~T3 地图 A 级评分规则(L859、L877、L895):FORMULAXPC>=4、FORMULAMFC>=4 等 6 处 >=4 在 ItemDisplay[...] 中属于非法多字符运算符(右值 "=4" 整数转换失败后直接丢弃该原子条件),导致下限 >=4 消失,经验或 MF 仅为 0~3 分的低收益地图被错误评为橙色 A 级!应改为 >3(或 ~4-6 合并上下界)。
    • 打孔腐化评分规则(L4248..4250):4 处 SOCKETS>=2 同样被静默丢弃,应改为 SOCKETS>1。
  2. ORPREFIX=968 粘连摧毁亮金法珠/法杖核心单系前缀(L5560 ➔ L5561、L5605):
    • Alias[GOODSOR] 末尾 (PREFIX=447 OR PREFIX=450 OR PREFIX=453 ORPREFIX=968 OR PREFIX=969 OR PREFIX=970) 中 ORPREFIX=968 漏写空格!
    • Condition::Parse 在 PREFIX=453 与 ORPREFIX=968 之间自动插入隐式 AND,而未知键 ORPREFIX 求值恒假;结合 BH.dll 从左到右等优先级求值,((PREFIX=447 OR PREFIX=450 OR PREFIX=453) AND FALSE) 恒为 FALSE——导致 +2 火系 (447)、+2 电系 (450)、+2 冰系 (453) 与 968 四组核心词缀在未鉴定 3★ 法师武器规则中全军覆没!只需改为 OR PREFIX=968。
  3. 7 种无瑕宝石手工配方条件优先级反转(L332..338):
    • (SHOW_CRAFT OR FILTLVL=5 STASH OR INVENTORY) 实际从左到右求值为 (((SHOW_CRAFT OR FILTLVL=5) AND STASH) OR INVENTORY)!
    • 双重反常现象:(1) 地面掉落或赫拉迪克方块内,即便打开 SHOW_CRAFT 也不显示配方;(2) 一旦捡进人物背包 (INVENTORY),无论 SHOW_CRAFT 是否关闭、过滤等级是多少,全部无条件强行显示长串配方!应加括号修正为 (SHOW_CRAFT OR FILTLVL=5) (STASH OR INVENTORY)。

三、P1 ~ P4 级动作宏、编码卫生、S14 覆盖度与性能优化

3.1 动作宏拼写错误(L3577)与 % 跨 { 奇偶错位(L183)

  1. L3577 未注册宏 %PTRLTS%:
    • %NAME%{%TIPLTS% %RED%Hi%ORANGE%g%YELLOW%h %WHITE%SK %CORAL%IAS %PTRLTS%%CL%%NAME%}%CONTINUE% 将右侧花边别名 %TIPRTS%(定义于 L17)误敲为 %PTRLTS%。经核对 BH.dll .rdata 全部 534 个宏常量表,全文件仅此一处未注册宏,游戏内物理攻速项链悬浮窗会直接打印刺眼的字面量 "%PTRLTS%"。
  2. L183 小紫瓶 rvs 悬浮窗小写 r 被篡改为大写 R:
    • %PURPLE%r %WHITE%35%{%PURPLE%r%WHITE%35%+ ... 中,Action::Parse (0x10171e50) 在切分 { 之前先执行小写宏转大写正则;地面名字末尾 35% 的 % 与 { 后 %PURPLE% 的首 % 配成一对 %{%,导致后续 % 配对全部错位一位,将 %PURPLE%r%WHITE% 中间的字面量 %r% 当作小写宏原地改为大写 R(渲染出 R35%+,与大紫瓶 R65% 符号混淆)。在 r 后加空格或转义避免夹在两个 % 之间即可修复。

3.2 中段隐形 UTF-8 BOM、无效物品代码与 22 条悬浮窗吞没原版属性

  1. 中段混入 2 处隐形 UTF-8 BOM (U+FEFF):L1251 与 L4430 行首存在 0xEF 0xBB 0xBF 位于 // 之前(多文件合并时子文件带 BOM 所致),导致 BH.dll 无法将其识别为注释行。
  2. 标准 ZYLPD2 S14 不存在的物品代码与缺失新道具:
    • L542..615 共 33 条规则包含不存在的护身符代码 cm4;L75 SOEMAPS 及 L736..801 包含 SoE 私服专属代码 tm1i..tm9i(共展开 99 次无效比较);
    • 缺少 S14 特殊道具 lmal(拉苏克之槌)、rtmf、cm1p/cm2p/cm3p(PvP 护身符)的专属高亮规则,且缺少类似 BadWolf L4330 的未知新版本道具高优提醒兜底。
  3. 22 条非 %CONTINUE% 规则在 {...} 中漏写 %NAME% 吞没装备原版面板(高影响体验问题!):
    • L360(40ED/15IAS 极品红白珠)与 L381..394(全部 10 条五系暗金彩虹刻面珠宝 !GROUND 规则):在 {...} 内未写 %NAME% 且行尾无 %CONTINUE%!玩家在背包或仓库内把鼠标移到暗金电珠/火珠/冰珠或 40/15 珠宝上时,原版词缀明细、需求等级、镶嵌部位说明被完全抹除,仅剩一行彩色星号!
    • 其余受影响规则还包括:L181 (pvpp)、L615(90+ 级重洗板子)、L5066 & L5073(手工项链/戒指配方)、L6782..6784、L6786、L6790、L6792、L6794(恰西注入底材,注意同组的 L6789 与 L6796 正确写了 %CL%%NAME%,唯独这 7 条漏写)。

3.3 编码规范与 4,366 条规则的帧率性能优化路线图

  • 规范清理:统一 L3546..3552 (%gray%)、L5624..5625 (%Orange%)、L5626..5628 (%Coral%)、L5648..5650 (%Red%) 共 14 处大小写混写宏为全大写(减少 0x10171e50 加载期 std::wregex 循环开销);清理 0 次引用的幽灵面板开关 L133 Alias[IS_XXX] 及 L3894..3905 中 3 组完全重复的常量别名 SC_CAS*/PHY*/DEF*/UTL*。
  • 帧率热路径重构(4,366 条规则瘦身):
    • ViLoot.txt 规则总数达 4,366 条(体积 743 KB,约为 BadWolf 2,561 条的 1.70 倍)。在高密度 T3/T4 地图百件战利品同屏时,BH.dll 对地面每件物品每帧线性遍历全部规则:
    • 将 L542..572 按单个 PREFIX 拆成 30 条的超大护身符规则、以及腐化词缀说明中重复匹配相同前置条件的数百条 %CONTINUE% 规则按物品大类合并或收敛为 Formula 查表,可将热路径规则数削减约 25% ~ 35%,显著提升高密度刷图帧率稳定性。
### 📎 完整排版 PDF 审计报告附件 - **[📄 点击下载《ViLoot_v1.2.8_深度审计与改进报告.pdf》(6 页 A4 矢量图表排版完整版)](https://git.projectdiablo2.cn/attachments/96ae2960-2023-4371-9346-55c0f8545d61)** - **审计方法说明**:本报告基于 ZYLPD2 S14 客户端 `BH.dll` 机器码反汇编与 `pd2data.mpq` 数据表,对最新主分支 `ViLoot.txt`(`v1.2.8`, commit `1a84a315c4`)进行了全量静态词法、AST 语法树与游戏内语义审计,整理出以下问题定位与修复建议供参考。 --- > **📌 核心结论与审计基准** > > - **审计基准**:[ViLoot.txt (`v1.2.8`, commit `1a84a315c4`)](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt),共 `6,824` 行、`743,121` 字节(解析出 `326` 条 `Alias`、`13` 条 `Formula`、`4,366` 条 `ItemDisplay` 规则)。 > - **验证真值(Ground Truth)**:严格对齐 ZYLPD2 S14 客户端 `BH.dll` 机器码反汇编(`ItemDisplay::Initialize` `0x1016f8c0`、`BuildConditionAST` `0x101718f0`、`ConvertToRPN` `0x10172e90`、`Condition::Parse` `0x101730c0`、`Action::Parse` `0x10171da0`、`CompileActionTokens` `0x10163000`)与 `pd2data.mpq` 数据表,零臆测、零误报。 > - **核心结论**:`ViLoot.txt` 在手工/稀有装备多维打分、地图词缀摘要与排版视觉体系上设计丰富,但存在 **7 类 P0 级引擎底层解析缺陷**——包括 **`Alias` 前缀子串覆盖摧毁 3 个面板开关与 5 条底材规则**、**单遍 `Alias` 反向引用失效导致未鉴定 3★ 头环规则 (`GOODCIRC`) 100% 报废**、**`[NIMA]` 底材总表 5 大职业全部误粘贴为刺客公式 (`FORMULAASNSK`)**、**括号失配导致 `L6751` 整条规则死亡与 `GOODBASE` 逃逸污染**,以及 **T1~T3 地图评分非法 `>=` 比较符被静默丢弃**。 --- ## 一、量化缺陷总览(按严重度分级) | 优先级 | 缺陷类别 | 数量 | 核心影响面摘要 | | :--- | :--- | :--- | :--- | | **P0 阻断** | `Alias` 前缀子串覆盖污染(无词界匹配) | 3 组别名 ➔ 篡改 5 条规则 | `L94..98` 的 `AMACRAFT`/`BARCRAFT`/`ASNCRAFT` 定义在 `L128..130` 的 `SHOW_*CRAFT` 之前,将 `SHOW_AMACRAFT` 撕裂为 `SHOW_(am7 OR amc)`,导致大院长弓对全职业强行无视开关开启,而有形刺客爪/野蛮人投掷底材在 `L6786`/`L6788` 下被泄露的 `ETH` 彻底误杀! | | **P0 阻断** | 单遍 `Alias` 反向引用永不展开(沦为恒假 `FalseCondition`) | 2 条核心别名 ➔ 瘫痪 5 条规则 | `L5455 GOODCIRC` 引用前序 `L5180..5186` 的 `SKAMA..SKASN`,7 大职业技能别名全部未展开并编译为 `FalseCondition`,**`L5456` 与 `L5527` 未鉴定亮金职业头环规则 100% 恒假报废**;`L3914 CORR_SM3` 引用 `L131 IS_SOE` 同样失效。 | | **P0 阻断** | 括号失配导致整条规则死亡与条件逃逸污染 | 2 处 ➔ 破坏 3 条规则 | `L6751` 德鲁伊狼头底材少 1 个 `)` 致 `BuildConditionAST` 失败(`root_idx = 0xffffffff` 整条永久死亡);`L91 GOODBASE` 中段 `ELT)` 提前闭合外层括号,前半段普通/扩展级底材被 `ELT` 误杀,后半段逃逸出 `NMAG !RW` 把黄/蓝/暗金/符文之语误标为“符文之语底材”。 | | **P0 阻断** | `[NIMA]` 符文之语底材总表复制粘贴灾难 | 5 条规则 (`L6808..6816`) | 野蛮人、德鲁伊、死灵法师、圣骑士、法师 5 大职业底材保底规则**全部原样复制���刺客 `FORMULAASNSK`**,导致这 5 大职业高技能白板底材失去保底,在 20 级后或 `FILTLVL>=3` 下直接跌入 `L6824 JUNKITEM` 被静默屏蔽! | | **P0 高危** | 非法 `>=` 条件运算符被 `Condition::Parse` 静默丢弃 | 6 条规则(共 10 处) | `L859`、`L877`、`L895`(T1~T3 地图 A 级评分)6 处 `>=4` 被静默丢弃,低分地图(`0~3` 分)误标橙色 `A` 级;`L4248..4250` 4 处 `SOCKETS>=2` 同样被静默丢弃。 | | **P0 高危** | 词法粘连与 `AND`/`OR` 等优先级逻辑反转 | 9 条规则 | `L5560 GOODSOR` 中 `PREFIX=453 ORPREFIX=968` 粘连插入隐式 `AND FALSE`,火/电/冰三大单系法杖/法珠前缀全灭;`L332..338` 7 种无瑕宝石在地面不显示配方、放进背包却无视开关强行刷屏。 | | **P1 严重** | 未注册动作宏拼写错误与 `%` 跨 `{` 奇偶错位 | 2 条规则 | `L3577` 误将 `%TIPRTS%` 写为 `%PTRLTS%`,悬浮窗原样输出字面量 `"%PTRLTS%"`;`L183` 小紫瓶 `35%{%PURPLE%r` 触发加载期正则错位,将 `{...}` 内小写 `r` 原地篡改为大写 `R`(`R35%+`)。 | | **P2 中危** | 中段残留 UTF-8 BOM、无效物品代码与 `{...}` 吞属性 | 2 处 BOM + 42 条规则 + 22 条悬浮窗 | `L1251`、`L4430` 混入隐形 BOM (`U+FEFF`);`cm4`(33 条)与 `tm1i..tm9i`(99 次展开)在标准 S14 中不存在;**`L360` 红白珠与 `L381..394` 全系彩虹刻面暗金珠宝**在背包内悬停时原版词缀属性被彻底抹除! | | **P3 / P4** | 大小写混写宏、幽灵开关与 `4,366` 条规则性能优化 | 14 处宏 + 1 开关 + 架构 | 14 处 `%gray%`/`%Orange%`/`%Coral%`/`%Red%` 依赖加载期正则兜底;`L133 IS_XXX` 0 引用;`743 KB` / `4,366` 条规则每帧线性扫描开销比同类过滤器高约 70%。 | --- ## 二、P0 级引擎底层解析缺陷深度剖析(`BH.dll` 机器码实证) ### 2.1 `Alias` 前缀子串无词界覆盖:`AMACRAFT` / `BARCRAFT` / `ASNCRAFT` 摧毁面板开关与 5 条规则 在 `BH.dll` 的 `ItemDisplay::Initialize` (`0x101708ac..0x10170cc9`) 中,引擎对每条 `ItemDisplay` 条件串按 `Alias` 在文件中的**定义行号从前向后单遍执行 `std::wstring::find` 原文子串替换(不检查单词边界)**。 在 `ViLoot.txt` 中,底材集合别名定义在 **`L94..98`**,而对应的 BH 面板开关却定义在后方的 **`L128..130`**: - [L94](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L94) `Alias[AMACRAFT]: (am7 OR amc)` ➔ 先于 [L128](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L128) `Alias[SHOW_AMACRAFT]: FALSE` 执行! - [L96](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L96) `Alias[BARCRAFT]: ((glv OR 9gl OR 7gl OR tsp OR 9ts OR 7ts) ETH)` ➔ 先于 [L129](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L129) `Alias[SHOW_BARCRAFT]: FALSE` 执行! - [L98](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L98) `Alias[ASNCRAFT]: ((axf OR 9xf OR 7xf) ETH)` ➔ 先于 [L130](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L130) `Alias[SHOW_ASNCRAFT]: FALSE` 执行! ![图 1:BH.dll 单遍无词界 Alias 子串替换导致 ASNCRAFT 撕裂 SHOW_ASNCRAFT 链路](https://git.projectdiablo2.cn/attachments/8a578eb0-fcaa-48d9-a01e-aca9aec05510) - **5 条受污染规则的精确运行时后果**(经 `0x101730c0` ➔ `0x10178e32` ➔ `0x10172e90` 指令级推演): 1. **[L5099](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5099) & [L6782](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6782)**:`SHOW_AMACRAFT` 被替换为 `SHOW_(am7 OR amc)`。`SHOW_(am7` 落入 `0x10178e32 FalseCondition`,但右侧 `OR amc` 对所有大院长之弓 (`amc`) **恒为 `TRUE`**——即便面板开关默认 `FALSE`,非亚马逊职业在任何过滤等级下都会被强制显示所有未鉴定蓝/黄及白板 0 孔 `amc`! 2. **[L6786](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6786)(刺客战拳注入底材)& [L6788](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6788)(野蛮人投掷注入底材)**:`SHOW_ASNCRAFT` / `SHOW_BARCRAFT` 被撕裂后,内层右括号提前闭合了 `(ASSASSIN OR FILTLVL=5 OR ...)`,导致末尾泄露出的 **`ETH` 被隐式 `AND` 到整条规则顶层**——**所有有形 (`!ETH`) 刺客爪 (`axf`/`9xf`/`7xf`) 与投掷武器哪怕是刺客/野蛮人本职业或手动勾选开关也永远无法匹配**! 3. **[L5101](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5101)(刺客手工爪)**:`OR 9xf OR 7xf` 绕过 `SHOW_ASNCRAFT=FALSE`,对全职业强制显示无形 `9xf`/`7xf`。 - **修复方案**:将 `L116..133` 的全部 `SHOW_*` / `HIDE_*` / `IS_*` 长名称面板开关移动到 `L94` 短名称底材别名**之前**(长名称优先展开即可彻底根除前缀覆盖)。 ### 2.2 单遍 `Alias` 反向引用失效:`GOODCIRC` (`L5455`) 与 `CORR_SM3` (`L3914`) `BH.dll` 在加载 `Alias[key]: val` (`0x1016f984`) 时**绝不展开 `val` 中的其他 `Alias`**;在对 `ItemDisplay` 展开时也仅从索引 `0` 到 `N-1` 正向遍历一次。因此,**后定义的 `Alias` 一旦在条件体中引用了先定义的 `Alias`,被引用项将永远无法展开**: 1. **[L5455](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5455) `Alias[GOODCIRC]: (SKAMA OR SKSOR OR SKNEC OR SKPAL OR SKBAR OR SKDRU OR SKASN)`**: - 7 大职业技能词缀别名 `SKAMA..SKASN` 全部定义在前方的 **[L5180..5186](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5180)**! - 当引擎遍历至索引对应的 `L5455` 将 `L5456` 与 `L5527` 中的 `GOODCIRC` 替换为 `(SKAMA OR ... OR SKASN)` 时,`L5180..5186` 早已遍历完毕!残留的 `SKAMA..SKASN`(长度均为 5 字符,非 3~4 字符物品代码)在 `Condition::Parse` (`0x10178e32`) 中**全部被编译为恒假 `FalseCondition`**! - **真实后果**:**[L5456](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5456)(未鉴定 3★ 亮金职业头环星标与边框通知)与 [L5527](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5527)(未鉴定亮金职业头环显示规则)100% 恒为 `FALSE`,彻底瘫痪**! 2. **[L3914](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L3914) `Alias[CORR_SM3]` 引用前序 [L131](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L131) `IS_SOE`**: - `CORR_SM3` 末尾的 `(IS_SOE BOOTS)` 在展开进 `L4248..4250` 后,`IS_SOE`(长 6 字符)未展开并沦为 `FalseCondition`,即使玩家在面板中开启 `IS_SOE=TRUE`,鞋子腐化孔数分支也永远不生效。 - **修复方案**:在 `BH.dll` 单遍架构下,**被引用的子 `Alias` 必须定义在引用它的父 `Alias` 之后**(例如将 `GOODCIRC` 移至 `SKAMA..SKASN` 之前,或直接内联展开)。 ### 2.3 括号失配:`L6751` 整条规则永久死亡与 `L91 GOODBASE` 条件逃逸污染 1. **[L6751](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6751)(极品复合技能德鲁伊狼头底材 `%RW_BASE_GOOD%`)少写 1 个右括号**��� ```text ItemDisplay[DRU (((SK221>2 OR SK247>2) OR (SK221>2 AND (SK227>2 OR SK237>2)) OR (SK240>1 AND SK245>1 AND SK250>1) OR ((SK240>2 OR SK250>2) AND SK245>2) OR (SK240>2 AND (SK245>2 OR SK250>2))) !INF !ETH NMAG !RW !SOCK=1]: %RW_BASE_GOOD%{%NAME%} ``` - `DRU` 后的 `(((` 开启了 3 层外括号,但在 `!INF` 前仅闭合了 2 层(整行左括号 10 个、右括号 9 个)。`ConvertToRPN` (`0x10172fb5`) 在末尾遇到未闭合 `'('` 提前中断,导致首词 `DRU` 与后续条件树未能通过 `AND` 合并,`BuildConditionAST` (`0x10171b05`) 校验 `ast_stack.size() == 2 != 1` 失败,将 `root_idx` 置为 **`0xffffffff`**——**整条 `L6751` 规则对所有物品恒返回 `false`**! 2. **[L91](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L91) `Alias[GOODBASE]` 漏写左括号导致中段 `ELT)` 提前闭合外层括号(污染 [L6803](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6803) & [L6804](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6804))**: ```text // L91 中段:OR (SK48>2 OR SK61>2 OR SK63>2 OR SK65>2) ELT) 漏了外包 '(',提前闭合了 GOODBASE 首字符 '('! Alias[GOODBASE]: ($f(SK221+SK222+SK247)>7 ... OR (SK48>2 OR SK61>2 OR SK63>2 OR SK65>2) ELT) OR (SK69>2 SK70>2) OR (SK79>2 SK94>2) OR (SK252>2 (SK263>2 OR SK275>2))) ``` ![图 2:L91 Alias[GOODBASE] 漏写左括号致中段 ELT) 提前闭合外层括号的双重污染效应](https://git.projectdiablo2.cn/attachments/b084a6cb-e9b1-4177-97b7-ec2ec9301abd) ### 2.4 `[NIMA]` 底材总表复制粘贴灾难(`L6805..6816`):5 大职业全部误写为刺客 `FORMULAASNSK` 在文件末尾紧邻 `JUNKITEM` 垃圾底材屏蔽规则之前的 `[NIMA] NMAG Items Master` 总表兜底区([L6805..6816](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L6805)): ```text //Assasin ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%} //Barbarian ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%} //Druid ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%} //Necromancer ItemDisplay[NMAG !RW !SOCK=1 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%} //Paladin ItemDisplay[NMAG !RW !SOCK~1-2 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%} //Sorceress ItemDisplay[NMAG !RW !SOCK=1 ((FORMULAASNSK>5 FILTLVL<3) OR FORMULAASNSK>8)]: %NAME%{%NAME%} ``` - **严重后果**:尽管文件已在 `L2384..2389` 定义好了 `Formula[BARSK]`、`Formula[DRUSK]`、`Formula[NECSK]`、`Formula[PALSK]`、`Formula[SORSK]`,但 `L6808..6816` 的 5 条规则**全部原封不动粘贴了 `FORMULAASNSK`**!这导致上述 5 大职业总技能 `>5` 或 `>8` 的白板底材在 `[NIMA]` 区完全无法命中,一旦未被前序特定规则接住,在角色 `CLVL>19` 或 `FILTLVL>2` 时将直接跌入 `L6824` (`JUNKITEM`) 被**静默隐藏**! - **修复方案**:分别替换为对应职业的 `FORMULABARSK`(限定 `BAR`)、`FORMULADRUSK`(限定 `DRU`)、`FORMULANECSK`(限定 `NEC OR WAND`)、`FORMULAPALSK`(限定 `DIN OR SCEPTER`)、`FORMULASORSK`(限定 `SOR OR STAFF`)。 ### 2.5 非法 `>=` 比较符被静默丢弃(6 条规则)与等优先级/粘连缺陷(9 条规则) 1. **非法 `>=` 条件比较符被 `Condition::Parse` 静默丢弃(共 10 处)**: - **T1~T3 地图 A 级评分规则**([L859](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L859)、[L877](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L877)、[L895](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L895)):`FORMULAXPC>=4`、`FORMULAMFC>=4` 等 6 处 `>=4` 在 `ItemDisplay[...]` 中属于非法多字符运算符(右值 `"=4"` 整数转换失败后直接丢弃该原子条件),导致下限 `>=4` 消失,**经验或 MF 仅为 `0~3` 分的低收益地图被错误评为橙色 `A` 级**!应改为 `>3`(或 `~4-6` 合并上下界)。 - **打孔腐化评分规则**([L4248..4250](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L4248)):4 处 `SOCKETS>=2` 同样被静默丢弃,应改为 `SOCKETS>1`。 2. **`ORPREFIX=968` 粘连摧毁亮金法珠/法杖核心单系前缀([L5560](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L5560) ➔ `L5561`、`L5605`)**: - `Alias[GOODSOR]` 末尾 `(PREFIX=447 OR PREFIX=450 OR PREFIX=453 ORPREFIX=968 OR PREFIX=969 OR PREFIX=970)` 中 `ORPREFIX=968` 漏写空格! - `Condition::Parse` 在 `PREFIX=453` 与 `ORPREFIX=968` 之间自动插入**隐式 `AND`**,而未知键 `ORPREFIX` 求值恒假;结合 `BH.dll` 从左到右等优先级求值,`((PREFIX=447 OR PREFIX=450 OR PREFIX=453) AND FALSE)` 恒为 `FALSE`——**导致 `+2 火系 (447)`、`+2 电系 (450)`、`+2 冰系 (453)` 与 `968` 四组核心词缀在未鉴定 3★ 法师武器规则中全军覆没**!只需改为 `OR PREFIX=968`。 3. **7 种无瑕宝石手工配方条件优先级反转([L332..338](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L332))**: - `(SHOW_CRAFT OR FILTLVL=5 STASH OR INVENTORY)` 实际从左到右求值为 `(((SHOW_CRAFT OR FILTLVL=5) AND STASH) OR INVENTORY)`! - **双重反常现象**:(1) 地面掉落或赫拉迪克方块内,即便打开 `SHOW_CRAFT` 也不显示配方;(2) 一旦捡进人物背包 (`INVENTORY`),**无论 `SHOW_CRAFT` 是否关闭、过滤等级是多少,全部无条件强行显示长串配方**!应加括号修正为 `(SHOW_CRAFT OR FILTLVL=5) (STASH OR INVENTORY)`。 --- ## 三、P1 ~ P4 级动作宏、编码卫生、S14 覆盖度与性能优化 ### 3.1 动作宏拼写错误(`L3577`)与 `%` 跨 `{` 奇偶错位(`L183`) 1. **[L3577](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L3577) 未注册宏 `%PTRLTS%`**: - `%NAME%{%TIPLTS% %RED%Hi%ORANGE%g%YELLOW%h %WHITE%SK %CORAL%IAS %PTRLTS%%CL%%NAME%}%CONTINUE%` 将右侧花边别名 `%TIPRTS%`(定义于 `L17`)误敲为 **`%PTRLTS%`**。经核对 `BH.dll` `.rdata` 全部 534 个宏常量表,全文件仅此一处未注册宏,游戏内物理攻速项链悬浮窗会直接打印刺眼的字面量 `"%PTRLTS%"`。 2. **[L183](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L183) 小紫瓶 `rvs` 悬浮窗小写 `r` 被篡改为大写 `R`**: - `%PURPLE%r %WHITE%35%{%PURPLE%r%WHITE%35%+ ...` 中,`Action::Parse` (`0x10171e50`) 在切分 `{` **之前**先执行小写宏转大写正则;地面名字末尾 `35%` 的 `%` 与 `{` 后 `%PURPLE%` 的首 `%` 配成一对 `%{%`,导致后续 `%` 配对全部错位一位,将 `%PURPLE%r%WHITE%` 中间的字面量 **`%r%`** 当作小写宏原地改为大写 **`R`**(渲染出 `R35%+`,与大紫瓶 `R65%` 符号混淆)。在 `r` 后加空格或转义避免夹在两个 `%` 之间即可修复。 ### 3.2 中段隐形 UTF-8 BOM、无效物品代码与 22 条悬浮窗吞没原版属性 1. **中段混入 2 处隐形 UTF-8 BOM (`U+FEFF`)**:[L1251](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L1251) 与 [L4430](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L4430) 行首存在 `0xEF 0xBB 0xBF` 位于 `//` 之前(多文件合并时子文件带 BOM 所致),导致 `BH.dll` 无法将其识别为注释行。 2. **标准 ZYLPD2 S14 不存在的物品代码与缺失新道具**: - [L542..615](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L542) 共 **33 条规则**包含不存在的护身符代码 `cm4`;[L75](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L75) `SOEMAPS` 及 `L736..801` 包含 SoE 私服专属代码 `tm1i..tm9i`(共展开 99 次无效比较); - 缺少 S14 特殊道具 `lmal`(拉苏克之槌)、`rtmf`、`cm1p`/`cm2p`/`cm3p`(PvP 护身符)的专属高亮规则,且缺少类似 `BadWolf` `L4330` 的未知新版本道具高优提醒兜底。 3. **22 条非 `%CONTINUE%` 规则在 `{...}` 中漏写 `%NAME%` 吞没装备原版面板**(高影响体验问题!): - **[L360](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L360)(40ED/15IAS 极品红白珠)与 [L381..394](https://git.projectdiablo2.cn/Vagrim/Vi-LootFilter/src/commit/1a84a315c4abfd7f7302a6f75a1c77685c521726/ViLoot.txt#L381)(全部 10 条五系暗金彩虹刻面珠宝 `!GROUND` 规则)**:在 `{...}` 内未写 `%NAME%` 且行尾无 `%CONTINUE%`!玩家在背包或仓库内把鼠标移到暗金电珠/火珠/冰珠或 40/15 珠宝上时,**原版词缀明细、需求等级、镶嵌部位说明被完全抹除,仅剩一行彩色星号**! - 其余受影响规则还包括:`L181` (`pvpp`)、`L615`(90+ 级重洗板子)、`L5066` & `L5073`(手工项链/戒指配方)、`L6782..6784`、`L6786`、`L6790`、`L6792`、`L6794`(恰西注入底材,注意同组的 `L6789` 与 `L6796` 正确写了 `%CL%%NAME%`,唯独这 7 条漏写)。 ### 3.3 编码规范与 `4,366` 条规则的帧率性能优化路线图 - **规范清理**:统一 `L3546..3552` (`%gray%`)、`L5624..5625` (`%Orange%`)、`L5626..5628` (`%Coral%`)、`L5648..5650` (`%Red%`) 共 14 处大小写混写宏为全大写(减少 `0x10171e50` 加载期 `std::wregex` 循环开销);清理 0 次引用的幽灵面板开关 `L133 Alias[IS_XXX]` 及 `L3894..3905` 中 3 组完全重复的常量别名 `SC_CAS*/PHY*/DEF*/UTL*`。 - **帧率热路径重构(`4,366` 条规则瘦身)**: - `ViLoot.txt` 规则总数达 `4,366` 条(体积 `743 KB`,约为 `BadWolf` `2,561` 条的 **1.70 倍**)。在高密度 T3/T4 地图百件战利品同屏时,`BH.dll` 对地面每件物品每帧线性遍历全部规则: - 将 `L542..572` 按单个 `PREFIX` 拆成 30 条的超大护身符规则、以及腐化词缀说明中重复匹配相同前置条件的数百条 `%CONTINUE%` 规则按物品大类合并或收敛为 `Formula` 查表,可将热路径规则数削减约 **25% ~ 35%**,显著提升高密度刷图帧率稳定性。
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Vagrim/Vi-LootFilter#1
No description provided.