例子:一键奶 V5
视频教程
一键奶 版本5
利用黑兔超级宏,可以自动扫描团队或小队成员的血量缺口,智能选择合适等级的治疗技能。无需手动切目标,按一下即可完成治疗。
注意
需要黑兔版本 >= 1.11.11,如果正式版低于这个版本,请在黑兔设置里面开启测试版推送
这只是一个例子,你完全可以自己阅读或者让AI阅读黑兔超级宏文档之后(把网址给AI),根据你的需要完善这个函数
V5 相比 V4 升级了什么
| 升级项 | V4 | V5 |
|---|---|---|
| 单人模式 | ❌ 不在团队时无法使用 | ✅ 不在团队时自动把自己加入扫描列表,单人也可以用 |
| 跳过已有HOT | ❌ 不支持 | ✅ 配置 noAura 字段,目标身上已有该光环则跳过,避免覆盖 |
| 智能取消施法 | ✅ | ✅ |
| 全职业自动识别 | ✅ | ✅ |
详细说明
1. 单人模式(最大亮点)
V4 依赖 TeamMembers() 获取团队成员列表,如果不在任何队伍中,该列表为空,宏无法工作。
V5 检测到不在团队时,会自动把自己加入扫描列表,这样即便单人野外刷怪也能正常使用。同时如果开启了宠物治疗,也会自动治疗自己的宠物。
2. 跳过已有 HOT(避免覆盖)
V5 新增 noAura 字段。设为某个法术 ID 时,扫描会跳过身上已有该光环的目标。
典型场景:
- 牧师补恢复:设
noAura = 25315(恢复光环ID),不会给已经有恢复的目标重复套 - 德鲁伊补回春:设
noAura = 25299(回春术光环ID),只给没有回春的目标补 - 防止覆盖别人的 HOT,省蓝高效
noAura = 0(默认)表示不判断,行为同 V4。
适用场景
- 团队副本中快速补血
- 小队任务中自动奶队友
- PVP 中应急治疗
- 单人练级/野外刷怪时自动奶自己
- 补 HOT/恢复时避免覆盖已有 buff
使用方法
- 打开黑兔软件 → 超级宏
- 在编辑区填入【完整代码】函数代码
- 游戏内使用
/s S HealRaid()调用
或者在游戏里新建一个宏,输入以下内容:
/s S HealRaid()然后把宏拖到动作条上,设置快捷键。按一下即可自动治疗团队中血量缺口最大的成员。
完整代码
在黑兔软件 超级宏 编辑器中输入:
-- 记录上次治疗的目标,用于再次按键时判断是否需要取消施法
-- 复制到黑兔编辑器的时候,这个也要复制
local lastHealTarget = nil
function HealRaid()
-- ============ 智能取消:如果上次治疗的目标已满血,取消当前施法 ============
if lastHealTarget then
local lastInfo = GetUnitInfo(lastHealTarget)
if lastInfo and lastInfo.health > 0 and lastInfo.health >= lastInfo.maxHealth then
StopCasting()
if DEBUG_HEAL then print("取消施法:" .. lastInfo.name .. " 已满血") end
lastHealTarget = nil
-- 继续往下扫描,寻找下一个需要治疗的队友
end
end
-- ============ 配置区(按需修改)============
-- 是否同时治疗宠物(true=开启,false=关闭)
local INCLUDE_PETS = true
-- 是否输出治疗调试信息(true=打印,false=静默)
local DEBUG_HEAL = true
-- 根据自身职业自动选择技能配置
local me = GetMeInfo()
local classId = me and me.classId or 0
if classId == 0 then
print("一键奶:获取自身职业失败,classId=0,请确认黑兔已连接游戏")
return
end
-- 治疗等级配置,按优先级从高到低排列
-- minLost: 最低血量缺口 maxDist: 最大施法距离(码)
-- spellId: 技能ID name: 技能名称(仅用于调试输出)
-- noAura: 跳过已持有该光环的目标(如恢复/回春),0=不判断
local LEVELS = {}
if classId == 2 then -- 圣骑士
-- 60级策略:圣光闪现R1最省蓝,圣光术R4是常见下级治疗,R8满级救命
LEVELS = {
{ 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是牧师最知名下级治疗,强效治疗术给坦克,快速治疗应急
LEVELS = {
{ minLost = 5000, maxDist = 40, spellId = 25315, name = "恢复(满级)", noAura = 25315 }, -- 目标没有恢复,就先上恢复
{ minLost = 5000, maxDist = 40, spellId = 25314, 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级策略:治疗链自动跳转智能团刷,治疗波给坦克,次级治疗波快速抬血
LEVELS = {
{ 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
LEVELS = {
{ 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 },
}
else
print("当前职业无内置治疗配置,classId=" .. classId .. ",请手动添加LEVELS")
return
end
-- 注意:血量缺口相同的等级,靠前的优先级更高
-- ==========================================
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 DEBUG_HEAL then print("一键奶:不在团队中,仅治疗自己") end
end
end
-- 构建宠物扫描列表
if INCLUDE_PETS then
for i, m in ipairs(scanList) do
local info = GetUnitInfo(m.guid)
if info and info.petGuid and info.petGuid ~= "" and info.petGuid ~= "0" then
scanList[#scanList + 1] = { guid = info.petGuid }
end
end
end
-- 按优先级遍历每个治疗等级
for _, lv in ipairs(LEVELS) do
local bestLost = 0
local bestInfo = nil
local bestGuid = ""
for _, m in ipairs(scanList) do
local info = GetUnitInfo(m.guid)
if info and info.health > 0 and info.maxHealth > 0 then
local lost = info.maxHealth - info.health
if lost >= lv.minLost then
local dist = Distance(m.guid)
if dist <= lv.maxDist and lost > bestLost then
-- ============ V5新增: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 = m.guid
end
end
end
end
end
-- 当前等级有符合条件的目标,直接施放并结束
if bestInfo ~= nil then
if DEBUG_HEAL then
print("治疗: " ..
bestInfo.name .. "[" .. lv.name .. "] 缺口:" .. bestLost .. " 距离:" .. math.floor(Distance(bestGuid)))
end
Spell(lv.spellId, bestGuid)
lastHealTarget = bestGuid -- 记录本次目标,供下次取消判断
return
end
end
-- 没有需要治疗的队友
if DEBUG_HEAL then print("无需治疗") 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=不判断 |
示例:牧师补恢复(不覆盖已有的)
不想给已经有恢复的目标重复套恢复,把最低优先级的恢复技能设上 noAura:
elseif classId == 5 then -- 牧师
LEVELS = {
-- 最高优先级:补恢复,但只给没有恢复的目标(恢复光环ID=25315)
{minLost = 5000, maxDist = 40, spellId = 25315, name = "恢复(满级)", noAura = 25315 },
{minLost = 5000, maxDist = 40, spellId = 25314, 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 == 11 then -- 德鲁伊
LEVELS = {
{minLost = 5000, maxDist = 40, spellId = 25297, name = "治疗之触(满级)", noAura = 0},
{minLost = 1500, maxDist = 40, spellId = 5188, name = "治疗之触(等级4)", noAura = 0},
-- 愈合:只给没有愈合HOT的目标(愈合光环ID=8936)
{minLost = 1000, maxDist = 40, spellId = 8941, name = "愈合(等级5)", noAura = 8936},
-- 回春:只给没有回春的目标(回春光环ID=774)
{minLost = 500, maxDist = 40, spellId = 8938, name = "回春(等级2)", noAura = 25299},
{minLost = 1, maxDist = 40, spellId = 8936, name = "愈合(等级1)", noAura = 0},
}关闭单人模式
如果你不希望单人时治疗自己,可以注释掉相关代码段,或始终保留 if #members > 0 判断并加一个 return 提前退出。
注意事项
- 需要先在黑兔中开启改模型功能,超级宏会自动生效
- 建议关闭杀毒软件或将黑兔目录加入白名单
- 技能 ID 可通过数据库网站(如 db.heitu.org)查询
- 支持全部 60/70/80 级版本客户端(112/114/243/253/343)
noAura为0时完全跳过光环判断,不影响宏效率- 光环判断基于客户端缓存数据,确保目标在可见范围内
- 单人模式时如果开启了
INCLUDE_PETS,也会自动扫描自己的宠物
常见问题
问题1:按教程操作之后不好使
首先把黑兔软件版本升级到最新,然后检查下宏里面的技能ID是否正确,不要直接复制就用,例子里面的技能ID是80级骑士的。
问题2:如果我好几个职业想用一键奶怎么办
无需任何操作! 宏已内置全职业自动识别,会根据 GetMeInfo().classId 自动切换对应职业的技能配置。
问题3:怎么取消正在读条的治疗
当目标已经满血(比如被其他治疗顶满),再次按下宏即可自动取消当前施法。
问题4:单人时宏不工作
V5 已解决此问题。不在团队时会自动把自己加入扫描列表,单人练级也能正常使用。
问题5:怎么查光环的法术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。比如恢复技能 ID 是 25315,但目标身上的恢复光环 ID 是 139。可以用上面问题 5 的脚本确认。