# 自动下马 / 取消变形(Auto Dismount)技术总结 ## 功能概述 骑乘或变形状态下尝试施法时,自动取消坐骑 / 变形 buff,使下次施法直接生效。 ## 检测架构(三层) ### 第 1 层 — 错误消息匹配 监听 `UI_ERROR_MESSAGE` 事件: | 方式 | 说明 | |---|---| | 哈希表精确匹配 | `ERR_ATTACK_MOUNTED`, `ERR_NOT_WHILE_MOUNTED`, `ERR_MOUNT_SHAPESHIFTED` 等标准全局变量 | | 关键词模糊匹配 | `mounted`, `shapeshifted`, `坐骑`, `骑乘`, `变形`, `形态`(兜底自定义错误消息) | > Turtle WoW 使用自定义错误 `"你正在骑乘状态"`,不在标准全局变量中,通过关键词 `"骑乘"` 命中。 ### 第 2 层 — Dismount() API 客户端若提供 `Dismount()` 函数则先调用(`pcall` 包裹),**不 early return**,继续 buff 扫描作为后备。 ### 第 3 层 — Buff 扫描(0-39) 遍历玩家 buff,逐个按优先级检测: | 优先级 | 检测方式 | 目标 | 示例 | |---|---|---|---| | 1 | 变形图标匹配 | 德鲁伊 / 萨满形态 | `ability_druid_catform`, `spell_nature_spiritwolf` | | 2 | 坐骑图标模式 | 坐骑 buff 图标 | `ability_mount_*`, `inv_pet_speedy` | | 3 | Tooltip 速度文本 | 坐骑速度描述(多语言) | `"又慢又稳"`, `"Increases speed by"` | | 4 | Buff 名称关键词 | Tooltip 首行含坐骑关键词 | `"骑乘"`, `"riding"` | ### 猎人守护跳过 猎人的猎豹 / 豹群守护使用 `ability_mount_*` 图标,需特殊跳过以免误取消。 ## 调试关键发现 ### Tooltip 扫描在 Turtle WoW 中失效 `GameTooltip:SetPlayerBuff(index)` 对所有 buff 均返回 **0 行**。 即使重新 `SetOwner`、尝试 `GetPlayerBuff` 返回的 buffId,结果相同。 **影响**:tooltip 检测路径完全失效,必须依赖图标模式匹配。 ### 非标准坐骑图标 | 坐骑 | 实际图标纹理 | |---|---| | 骑乘乌龟 | `inv_pet_speedy`(不匹配 `ability_mount_*`) | | 标准坐骑 | `Ability_Mount_*` | | AQ 坐骑 | `inv_misc_qirajicrystal_*` | ## 完整图标模式清单 ```lua -- 坐骑 mountIconPatterns = { "ability_mount_", "inv_misc_qirajicrystal", "inv_pet_speedy", } -- 变形 shapeshiftIcons = { "ability_racial_bearform", -- 熊形态 "ability_druid_catform", -- 猫形态 "ability_druid_travelform", -- 旅行形态 "spell_nature_forceofnature", -- 枭兽形态 "ability_druid_aquaticform", -- 水栖形态 "spell_nature_spiritwolf", -- 幽魂之狼 "ability_druid_treeoflife", -- 生命之树 "ability_druid_stagform", -- 鹿形态 "ability_druid_flightform", -- 飞行形态 } -- 猎人守护(跳过) hunterAspectIcons = { "ability_mount_jungletiger", -- 猎豹守护 "ability_mount_packhorse", -- 豹群守护 } ``` ## 扩展方法 遇到新坐骑无法自动下马时: 1. 在 `InitAutoDismount` 中将 `_debug` 设为 `true` 2. 骑上坐骑施法,查看聊天窗口中的 `[Nanami-DBG] buff[x]=` 输出 3. 将新坐骑的图标关键字添加到 `mountIconPatterns`