例子:一键奶 V6
视频教程
一键奶 版本6
利用黑兔超级宏,可以自动扫描团队或小队成员的血量缺口,智能选择合适等级的治疗技能。无需手动切目标,按一下即可完成治疗。
注意
需要黑兔版本 >= 1.11.15,如果正式版低于这个版本,请在黑兔设置里面开启测试版推送
这只是一个例子,你完全可以自己阅读或者让AI阅读黑兔超级宏文档之后(把网址给AI),根据你的需要完善这个函数
V6 相比 V5 升级了什么
| 升级项 | V5 | V6 |
|---|---|---|
| 优先目标 | ❌ 不支持,只能按血量缺口全团扫描 | ✅ 可设置优先治疗目标,只有缺口≥阈值才奶 |
| 跳过已有HOT | ✅ | ✅ |
| 智能取消施法 | ✅ | ✅ |
| 全职业自动识别 | ✅ | ✅ |
| 单人模式 | ✅ | ✅ |
详细说明
1. 优先目标(最大亮点)
V6 新增优先目标机制。你可以通过 HealRaid_AddTarget() 将当前选中的目标加入优先数组,治疗时优先扫描这个数组,只有优先目标的血量缺口达到 CFG_PRIORITY_MIN_LOST(默认200)时才会奶,不满足条件时才回退到大团扫描。
典型场景:
- MT/坦克挂了优先,优先保证坦克血线
- 打完 BOSS 清空优先,恢复正常团刷
2. 清空优先目标
新增 HealRaid_ClearTargets(),调用后清空所有优先目标,恢复全团正常扫描。
V6 完整功能列表
如果你是第一次使用一键奶,以下是 V6 支持的全部功能:
| 功能 | 说明 |
|---|---|
| 全职业自动识别 | 自动检测圣骑士/牧师/萨满/德鲁伊,切换对应技能表 |
| 多等级智能治疗 | 按血量缺口从大到小匹配技能等级,省蓝高效 |
| 智能取消施法 | 目标被顶满后再次按键自动取消读条,省蓝 |
| 单人模式 | 不在团队时自动奶自己,野外练级也能用 |
| 宠物治疗 | 开启后同时扫描团队成员及其宠物 |
| 跳过已有HOT | noAura 字段避免覆盖已有恢复/回春等HOT |
| 优先目标 | 可设置重点保护目标,缺口≥阈值时优先奶 |
| 清空优先 | 一键清空所有优先目标,恢复全团扫描 |
适用场景
- 团队副本中快速补血
- 小队任务中自动奶队友
- PVP 中应急治疗
- 单人练级/野外刷怪时自动奶自己
- 补 HOT/恢复时避免覆盖已有 buff
使用方法
- 打开黑兔软件 → 超级宏
- 在编辑区填入【完整代码】函数代码
- 游戏内使用以下命令:
治疗循环:
/s S HealRaid()做成宏设置快捷键,按一下即可自动治疗。
添加优先目标: 选中一个队友 → 执行 /s S HealRaid_AddTarget()
清空优先目标: /s S HealRaid_ClearTargets()
完整代码
在黑兔软件 超级宏 编辑器中输入:
-- ============================================================
-- 配 置 区(按需修改)
-- ============================================================
-- 是否输出治疗调试信息(true=打印,false=静默)
local CFG_DEBUG_HEAL = true
-- 是否同时治疗宠物(true=开启,false=关闭)
local CFG_INCLUDE_PETS = true
-- 优先目标最低血量缺口,低于此值不奶
local CFG_PRIORITY_MIN_LOST = 200
-- 优先目标数组(通过 HealRaid_AddTarget() 添加)
local CFG_priorityTargets = {}
-- 治疗等级配置,按优先级从高到低排列
-- minLost: 最低血量缺口 maxDist: 最大施法距离(码)
-- spellId: 技能ID name: 技能名称(仅用于调试输出)
-- noAura: 跳过已持有该光环的目标(如恢复/回春),0=不判断
-- 注意:血量缺口相同的等级,靠前的优先级更高
-- 每次调用根据当前职业重新获取治疗等级配置
function GetCfgLevels()
local me = GetMeInfo()
local classId = me and me.classId or 0
if classId == 2 then -- 圣骑士
-- 60级策略:圣光闪现R1最省蓝,圣光术R4是常见下级治疗,R8满级救命
return {
{ minLost = 5000, maxDist = 40, spellId = 10329, name = "圣光术(满级)", noAura = 0 },
{ minLost = 1500, maxDist = 40, spellId = 19943, name = "圣光闪现(满级)", noAura = 0 },
{ minLost = 1000, maxDist = 40, spellId = 1026, name = "圣光术(等级4)", noAura = 0 },
{ minLost = 1, maxDist = 40, spellId = 19750, name = "圣光闪现(等级1)", noAura = 0 },
}
elseif classId == 5 then -- 牧师
-- 60级策略:治疗术R2是牧师最知名下级治疗,强效治疗术给坦克,快速治疗应急
return {
{ minLost = 5000, maxDist = 40, spellId = 10929, name = "恢复(满级)", noAura = 10929 }, -- 目标没有恢复,就先上恢复
{ minLost = 5000, maxDist = 40, spellId = 10965, name = "强效治疗术(满级)", noAura = 0 },
{ minLost = 1500, maxDist = 40, spellId = 6064, name = "治疗术(等级4)", noAura = 0 },
{ minLost = 1000, maxDist = 40, spellId = 9474, name = "快速治疗(4级)", noAura = 0 },
{ minLost = 500, maxDist = 40, spellId = 2055, name = "治疗术(等级2)", noAura = 0 },
{ minLost = 1, maxDist = 40, spellId = 2054, name = "治疗术(等级1)", noAura = 0 },
}
elseif classId == 7 then -- 萨满
-- 60级策略:治疗链自动跳转智能团刷,治疗波给坦克,次级治疗波快速抬血
return {
{ minLost = 5000, maxDist = 40, spellId = 25357, name = "治疗波(满级)", noAura = 0 },
{ minLost = 1000, maxDist = 40, spellId = 10622, name = "治疗链(等级2)", noAura = 0 },
{ minLost = 1, maxDist = 40, spellId = 1064, name = "治疗链(等级1)", noAura = 0 },
}
elseif classId == 11 then -- 德鲁伊
-- 60级策略:治疗之触R4是德鲁伊最省蓝下级治疗,R11满级给坦克,愈合应急+HOT
return {
{ minLost = 5000, maxDist = 40, spellId = 25299, name = "回春(满级)", noAura = 25299 }, -- 如果没有回春,就先套回春
{ minLost = 5000, maxDist = 40, spellId = 25297, name = "治疗之触(满级)", noAura = 0 },
{ minLost = 1500, maxDist = 40, spellId = 5188, name = "治疗之触(等级4)", noAura = 0 },
{ minLost = 1000, maxDist = 40, spellId = 8941, name = "愈合(等级5)", noAura = 0 },
{ minLost = 500, maxDist = 40, spellId = 8938, name = "愈合(等级2)", noAura = 0 },
{ minLost = 1, maxDist = 40, spellId = 8936, name = "愈合(等级1)", noAura = 0 },
}
end
return {}
end
-- ============================================================
-- 将当前目标加入优先列表
-- 使用方式:选中一个队友,然后 /s S HealRaid_AddTarget()
function HealRaid_AddTarget()
local info = GetMeInfo()
if not info or not info.targetGuid or info.targetGuid == "0" then
print("请先选中一个目标")
return
end
local tInfo = GetUnitInfo(info.targetGuid)
if not tInfo then
print("无法获取目标信息")
return
end
-- 去重检查:目标已在列表中则提示并返回当前数量
for _, guid in ipairs(CFG_priorityTargets) do
if guid == info.targetGuid then
print("目标已在优先列表中: " .. tInfo.name .. ",当前共 " .. #CFG_priorityTargets .. " 个优先目标")
return
end
end
table.insert(CFG_priorityTargets, info.targetGuid)
print("已添加优先目标: " .. tInfo.name .. " (guid=" .. info.targetGuid .. "),当前共 " .. #CFG_priorityTargets .. " 个优先目标")
end
-- 清空所有优先目标
-- 使用方式:/s S HealRaid_ClearTargets()
function HealRaid_ClearTargets()
local count = #CFG_priorityTargets
CFG_priorityTargets = {}
print("已清空" .. count .. "个优先目标")
end
-- 记录上次治疗的目标,用于再次按键时判断是否需要取消施法
local CFG_lastHealTarget = nil
-- ============================================================
-- 通用扫描治疗函数:按 LEVELS 优先级遍历 scanList,对符合条件的目标施法
-- scanList: 形如 { { guid="xxx" }, ... } 的数组
-- minLostThreshold: 额外的最低血量缺口阈值,0=不限制
-- logPrefix: 调试输出的前缀(如 "优先治疗" / "治疗")
-- 返回 true 表示已施法,false 表示无合适目标
-- ============================================================
function TryHealScan(scanList, minLostThreshold, logPrefix)
minLostThreshold = minLostThreshold or 0
for _, lv in ipairs(GetCfgLevels()) do
local bestLost = 0
local bestInfo = nil
local bestGuid = ""
for _, m in ipairs(scanList) do
local guid = type(m) == "table" and m.guid or m
local info = GetUnitInfo(guid)
if info and info.health > 0 and info.maxHealth > 0 then
local lost = info.maxHealth - info.health
if lost >= lv.minLost and lost >= minLostThreshold then
local dist = Distance(guid)
if dist <= lv.maxDist and lost > bestLost then
-- noAura 判断:跳过已有该光环的目标
local noAuraOk = true
if lv.noAura and lv.noAura ~= 0 then
if info.auras then
for _, aura in ipairs(info.auras) do
if aura.spellId == lv.noAura then
noAuraOk = false
break
end
end
end
end
if noAuraOk then
bestLost = lost
bestInfo = info
bestGuid = guid
end
end
end
end
end
if bestInfo ~= nil then
if CFG_DEBUG_HEAL then
print(logPrefix .. ": " .. bestInfo.name .. "[" .. lv.name .. "] 缺口:" .. bestLost .. " 距离:" .. math.floor(Distance(bestGuid)))
end
Spell(lv.spellId, bestGuid)
CFG_lastHealTarget = bestGuid
return true
end
end
return false
end
-- ============================================================
function HealRaid()
-- ============ 智能取消:如果上次治疗的目标已满血,取消当前施法 ============
if CFG_lastHealTarget then
local lastInfo = GetUnitInfo(CFG_lastHealTarget)
if lastInfo and lastInfo.health > 0 and lastInfo.health >= lastInfo.maxHealth then
StopCasting()
if CFG_DEBUG_HEAL then print("取消施法:" .. lastInfo.name .. " 已满血") end
CFG_lastHealTarget = nil
-- 继续往下扫描,寻找下一个需要治疗的队友
end
end
-- 每次根据当前职业重新获取治疗等级配置
local cfgLevels = GetCfgLevels()
if not cfgLevels or #cfgLevels == 0 then
if CFG_DEBUG_HEAL then print("一键奶:职业配置为空,请检查职业是否支持") end
return
end
-- ============ V6新功能:优先目标扫描 ============
-- 先扫描优先目标数组,只有血量缺口>=CFG_PRIORITY_MIN_LOST才奶
if CFG_priorityTargets and #CFG_priorityTargets > 0 then
if TryHealScan(CFG_priorityTargets, CFG_PRIORITY_MIN_LOST, "优先治疗") then
return
end
end
-- ==========================================
local me = GetMeInfo()
local members = TeamMembers()
-- ============ V5新增:不在团队时,把自己加入扫描列表 ============
local scanList = {}
if members and #members > 0 then
-- 在团队中,正常添加所有成员
for i, m in ipairs(members) do
scanList[#scanList + 1] = m
end
else
-- 不在团队,把自己加进去
if me and me.guid then
scanList[#scanList + 1] = { guid = me.guid, name = "(自己)" }
if CFG_DEBUG_HEAL then print("一键奶:不在团队中,仅治疗自己") end
end
end
-- 构建宠物扫描列表
if CFG_INCLUDE_PETS then
for i, m in ipairs(scanList) do
local guid = type(m) == "table" and m.guid or m
local info = GetUnitInfo(guid)
if info and info.petGuid and info.petGuid ~= "" and info.petGuid ~= "0" then
scanList[#scanList + 1] = { guid = info.petGuid }
end
end
end
-- 大团扫描
if not TryHealScan(scanList, 0, "治疗") then
if CFG_DEBUG_HEAL then print("无需治疗") end
end
end并且点击界面右上角的【保存并且同步到游戏】按钮

工作原理
- 再次按下宏时,先检查上次治疗的目标是否已满血,若满血则取消当前施法(避免浪费法力),并继续扫描新目标
- 通过
GetMeInfo()自动识别当前职业,选择对应的治疗技能配置 - V5新增:检测
TeamMembers()是否为空,如果不在团队则把自己加入扫描列表 - 按治疗等级的优先级依次扫描
- 每个等级内,找到血量缺口最大且在距离范围内的队友
- V5新增:扫描时检查
noAura条件(如果配置了的话),跳过已持有该光环的目标 - 高优先级(紧急)找到目标就直接施放,不再检查低优先级
- 施放后记录目标,供下次取消判断使用
- 所有等级都没找到合适目标则什么都不做
flowchart TD
A[按下快捷键] --> A1{上次治疗目标是否已满血?}
A1 -->|是| A2[取消当前施法]
A2 --> A3[GetMeInfo 获取自身职业]
A1 -->|否| A3
A3 --> A4[根据职业选择对应技能表]
A4 --> A5{TeamMembers 是否为空?}
A5 -->|是| A6[把自己加入扫描列表]
A5 -->|否| A7[使用团队成员列表]
A6 --> A8[可选:添加宠物]
A7 --> A8
A8 --> B[按优先级遍历治疗等级]
B --> C{当前等级:扫描成员}
C --> D[跳过死亡/满血成员]
D --> E{血量缺口 >= 该等级阈值?}
E -->|是| F{距离 <= 该等级最大距离?}
F -->|是| F2{noAura = 0?}
F2 -->|否| F3{目标已有 noAura 光环?}
F3 -->|是| D
F3 -->|否| G
F2 -->|是| G[记录血量缺口最大的目标]
F -->|否| D
E -->|否| D
C --> H{当前等级找到目标?}
H -->|是| I[施放对应技能并记录目标]
H -->|否| J{还有更低等级?}
J -->|是| C
J -->|否| K[无需治疗]用到的函数说明
| 函数 | 说明 |
|---|---|
GetMeInfo() | 获取自身信息(职业 classId、血量、guid、光环列表等) |
TeamMembers() | 获取团队/小队所有成员列表(不在团队时返回空) |
GetUnitInfo(guid) | 通过 guid 获取成员详细信息(血量、状态、光环列表等) |
Distance(guid) | 获取指定成员与自身的距离(码) |
Spell(技能ID, guid) | 对指定成员施放技能 |
StopCasting() | 取消当前正在施法的技能 |
GetUnitInfo 返回的光环数据结构
info.auras = {
{
spellId = 774, -- 光环的法术ID
endTime = 1712345678, -- 光环到期时间戳(毫秒),0=长期有效
applications = 1, -- 光环层数
castUnitGuid = 12345, -- 施法者的GUID
},
-- ... 更多光环
}自定义修改
LEVELS 字段说明
V5 的 LEVELS 配置表每个条目增加了一个可选字段:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
minLost | number | 必填 | 最低血量缺口 |
maxDist | number | 必填 | 最大施法距离(码) |
spellId | number | 必填 | 施放的技能 ID |
name | string | 必填 | 技能名称(调试用) |
noAura | number | 0 | 目标不能持有的光环法术 ID,0=不判断 |
注意事项
- 需要先在黑兔中开启改模型功能,超级宏会自动生效
- 建议关闭杀毒软件或将黑兔目录加入白名单
- 技能 ID 可通过数据库网站(如 db.heitu.org)查询
- 支持全部 60/70/80 级版本客户端(112/114/243/253/343)
noAura为0时完全跳过光环判断,不影响宏效率- 光环判断基于客户端缓存数据,确保目标在可见范围内
- 单人模式时如果开启了
INCLUDE_PETS,也会自动扫描自己的宠物
常见问题
问题1:按教程操作之后不好使
首先把黑兔软件版本升级到最新,然后检查下宏里面的技能ID是否正确,不要直接复制就用,例子里面的技能ID是60年代的。
问题2:如果我好几个职业想用一键奶怎么办
无需任何操作! 宏已内置全职业自动识别,会根据 GetMeInfo().classId 自动切换对应职业的技能配置。
问题3:怎么取消正在读条的治疗
当目标已经满血(比如被其他治疗顶满),再次按下宏即可自动取消当前施法。
问题4:怎么查光环的法术ID
可以通过数据库网站(如 db.heitu.org)查询。也可以在游戏中对目标使用该技能后,利用黑兔的调试功能查看当前目标的光环列表。或者使用一个简单的 Lua 脚本遍历输出:
local info = GetUnitInfo("target")
if info and info.auras then
for _, aura in ipairs(info.auras) do
print("光环ID: " .. aura.spellId .. " 剩余: " .. aura.endTime .. " 层数: " .. aura.applications .. " 施法者: " .. aura.castUnitGuid)
end
end问题6:noAura 设为非0值后宏不工作了
请确认你填的是光环的法术 ID(即目标身上显示的 buff 的 spellId),而不是施放技能的 ID。