例子:一键奶 V4
视频教程
一键奶 版本4
利用黑兔超级宏,可以自动扫描团队或小队成员的血量缺口,智能选择合适等级的治疗技能。无需手动切目标,按一下即可完成治疗。
注意
需要黑兔版本 >= 1.11.9,如果正式版低于这个版本,请在黑兔设置里面开启测试版推送
这只是一个例子,你完全可以自己阅读或者让AI阅读黑兔超级宏文档之后(把网址给AI),根据你的需要完善这个函数
V4 相比 V3 升级了什么
| 升级项 | V3 | V4 |
|---|---|---|
| 智能取消施法 | ❌ 不支持,读条中目标被顶满只能读完浪费蓝 | ✅ 再次按键时自动检测上次目标,满血则取消施法省蓝 |
| 全职业自动识别 | ❌ 只有一个通用 LEVELS 配置表,换职业需手动改技能ID | ✅ 通过 GetMeInfo().classId 自动识别职业,内置骑/牧/萨/德四种配置 |
| 错误处理 | ❌ 无 classId 校验 | ✅ 增加 classId=0 检测与不支持职业的提示 |
| 版本要求 | 黑兔 >= 1.11.8 | 黑兔 >= 1.11.9 |
| 多职业切换 | 需要手动复制多份函数并改名(HealRaid1、HealRaid2…) | 同一份代码,自动适配所有职业 |
详细说明
1. 智能取消施法(最大亮点)
V4 记录了上一次治疗的目标(lastHealTarget),再次按下快捷键时,如果该目标已经被其他治疗顶满,会自动调用 StopCasting() 取消当前读条,节省法力并立即扫描下一个需要治疗的队友。
2. 全职业自动识别
V3 的 LEVELS 配置表只有一份,是写死的圣骑士技能ID。如果你玩多个治疗职业,需要复制多个函数、手动改每个函数的技能ID。
V4 改为通过 GetMeInfo() 获取当前角色的 classId,自动匹配对应的职业配置表。目前已内置:
- 圣骑士(classId=2):圣光术/圣光闪现多等级链
- 牧师(classId=5):强效治疗术/治疗术/快速治疗多等级链
- 萨满(classId=7):治疗波/治疗链多等级链
- 德鲁伊(classId=11):治疗之触/愈合多等级链
所有职业共用同一份代码,无需任何手动切换。
3. 更完善的错误处理
V4 增加了 classId == 0 的异常检测(黑兔未连接游戏时),以及不支持职业的友好提示,方便排查问题。
适用场景
- 团队副本中快速补血
- 小队任务中自动奶队友
- PVP 中应急治疗
使用方法
如果宏字数不够用,可以把函数放在黑兔的超级宏基础库中:
- 打开黑兔软件 → 超级宏
- 在编辑区填入以下函数代码
- 游戏内使用
/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: 技能名称(仅用于调试输出)
local LEVELS = {}
if classId == 2 then -- 圣骑士
-- 60级策略:圣光闪现R1最省蓝,圣光术R4是常见下级治疗,R8满级救命
LEVELS = {
{minLost = 5000, maxDist = 40, spellId = 10329, name = "圣光术(满级)"},
{minLost = 1500, maxDist = 40, spellId = 19943, name = "圣光闪现(满级)"},
{minLost = 1000, maxDist = 40, spellId = 1026, name = "圣光术(等级4)"},
{minLost = 1, maxDist = 40, spellId = 19750, name = "圣光闪现(等级1)"},
}
elseif classId == 5 then -- 牧师
-- 60级策略:治疗术R2是牧师最知名下级治疗,强效治疗术给坦克,快速治疗应急
LEVELS = {
{minLost = 5000, maxDist = 40, spellId = 25314, name = "强效治疗术(满级)"},
{minLost = 1500, maxDist = 40, spellId = 6064, name = "治疗术(等级4)"},
{minLost = 1000, maxDist = 40, spellId = 9474, name = "快速治疗(4级)"},
{minLost = 500, maxDist = 40, spellId = 2055, name = "治疗术(等级2)"},
{minLost = 1, maxDist = 40, spellId = 2054, name = "治疗术(等级1)"},
}
elseif classId == 7 then -- 萨满
-- 60级策略:治疗链自动跳转智能团刷,治疗波给坦克,次级治疗波快速抬血
LEVELS = {
{minLost = 5000, maxDist = 40, spellId = 25357, name = "治疗波(满级)"},
{minLost = 1000, maxDist = 40, spellId = 10622, name = "治疗链(等级2)"},
{minLost = 1, maxDist = 40, spellId = 1064, name = "治疗链(等级1)"},
}
elseif classId == 11 then -- 德鲁伊
-- 60级策略:治疗之触R4是德鲁伊最省蓝下级治疗,R11满级给坦克,愈合应急+HOT
LEVELS = {
{minLost = 5000, maxDist = 40, spellId = 25297, name = "治疗之触(满级)"},
{minLost = 1500, maxDist = 40, spellId = 5188, name = "治疗之触(等级4)"},
{minLost = 1000, maxDist = 40, spellId = 8941, name = "愈合(等级5)"},
{minLost = 500, maxDist = 40, spellId = 8938, name = "愈合(等级2)"},
{minLost = 1, maxDist = 40, spellId = 8936, name = "愈合(等级1)"},
}
else
print("当前职业无内置治疗配置,classId=" .. classId .. ",请手动添加LEVELS")
return
end
-- 注意:血量缺口相同的等级,靠前的优先级更高
-- ==========================================
local members = TeamMembers()
-- 构建扫描列表(包含成员,可选包含宠物)
local scanList = {}
for i, m in ipairs(members) do
scanList[#scanList + 1] = m
end
if INCLUDE_PETS then
for i, m in ipairs(members) do
local info = GetUnitInfo(m.guid)
if info and info.petGuid and info.petGuid ~= 0 then
scanList[#scanList + 1] = {guid = tostring(info.petGuid)}
end
end
end
-- 按优先级遍历每个治疗等级
for _, lv in ipairs(LEVELS) do
local bestLost = 0
local bestInfo = nil
local bestGuid = ""
for i, 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
bestLost = lost
bestInfo = info
bestGuid = m.guid
end
end
end
end
-- 当前等级有符合条件的目标,直接施放并结束
if bestInfo ~= nil then
if DEBUG_HEAL then print("治疗: " .. bestInfo.name .. "[" .. lv.name .. "] 缺口:" .. bestLost .. " 距离:" .. Distance(bestGuid)) end
Spell(lv.spellId, bestGuid)
lastHealTarget = bestGuid -- 记录本次目标,供下次取消判断
return
end
end
-- 没有需要治疗的队友
if DEBUG_HEAL then print("无需治疗") end
end并且点击界面右上角的【保存并且同步到游戏】按钮

工作原理
- 再次按下宏时,先检查上次治疗的目标是否已满血,若满血则取消当前施法(避免浪费法力),并继续扫描新目标
- 通过
GetMeInfo()自动识别当前职业,选择对应的治疗技能配置(支持圣骑士/牧师/萨满/德鲁伊) - 按治疗等级的优先级依次扫描
- 每个等级内,找到血量缺口最大且在距离范围内的队友
- 高优先级(紧急)找到目标就直接施放,不再检查低优先级
- 施放后记录目标,供下次取消判断使用
- 所有等级都没找到合适目标则什么都不做
flowchart TD
A[按下快捷键] --> A1{上次治疗目标是否已满血?}
A1 -->|是| A2[取消当前施法]
A2 --> A3[GetMeInfo 获取自身职业]
A1 -->|否| A3
A3 --> A4[根据职业选择对应技能表]
A4 --> B[按优先级遍历治疗等级]
B --> C{当前等级:扫描团队成员}
C --> D[跳过死亡/满血成员]
D --> E[检查血量缺口 >= 该等级阈值]
E -->|是| F{距离 <= 该等级最大距离?}
F -->|是| G[记录血量缺口最大的目标]
F -->|否| D
G --> D
E -->|否| D
C --> H{当前等级找到目标?}
H -->|是| I[施放对应技能并记录目标]
H -->|否| J{还有更低等级?}
J -->|是| C
J -->|否| K[无需治疗]用到的函数说明
| 函数 | 说明 |
|---|---|
GetMeInfo() | 获取自身信息(职业 classId、血量等),用于自动识别职业切换技能 |
TeamMembers() | 获取团队/小队所有成员列表 |
GetUnitInfo(guid) | 通过 guid 获取成员详细信息(血量、状态等) |
Distance(guid) | 获取指定成员与自身的距离(码) |
Spell(技能ID, guid) | 对指定成员施放技能 |
SpellStopCasting() | 取消当前正在施法的技能 |
自定义修改
宏已内置圣骑士/牧师/萨满/德鲁伊四种职业的默认技能配置,会自动根据你的职业切换。你只需要修改对应职业的 LEVELS 配置表即可:
调整治疗等级
找到你职业对应的 elseif classId == X then 分支,修改其中的 LEVELS:
-- 例如:调整圣骑士(classId == 2)的治疗阈值和距离
elseif classId == 2 then -- 圣骑士
LEVELS = {
{minLost = 8000, maxDist = 40, spellId = 48782, name = "圣光术"},
{minLost = 4000, maxDist = 40, spellId = 48785, name = "圣光闪现"},
{minLost = 1, maxDist = 30, spellId = 48825, name = "神圣震击"},
}更换技能
把你职业分支中的 spellId 换成对应等级的治疗技能 ID 即可,无需再手动区分职业。
按血量百分比判断(替代绝对血量缺口)
如果需要用百分比而不是绝对数值:
-- 在判断条件中改用 pct
local pct = (info.health / info.maxHealth) * 100
if pct < 60 and dist <= lv.maxDist then
-- 血量低于60%就治疗
end只奶特定小队
for i, m in ipairs(members) do
-- 只治疗第1小队的成员(subgroup 从0开始)
if m.subgroup == 0 then
-- ... 后续逻辑
end
end开启/关闭宠物治疗
将配置区的 INCLUDE_PETS 设为 true 后,一键奶会同时扫描团队成员及其宠物的血量,自动给掉血的宠物加血:
local INCLUDE_PETS = true -- 开启宠物治疗增加等级数量
配置表支持任意数量的等级,添加新行即可:
local LEVELS = {
{minLost = 8000, maxDist = 40, spellId = 48782, name = "圣光术"},
{minLost = 5000, maxDist = 40, spellId = 48785, name = "圣光闪现"},
{minLost = 2000, maxDist = 35, spellId = 48825, name = "神圣震击"},
{minLost = 1, maxDist = 30, spellId = 25235, name = "恢复"}, -- 新增第四级
}注意事项
- 需要先在黑兔中开启改模型功能,超级宏会自动生效
- 建议关闭杀毒软件或将黑兔目录加入白名单
- 技能 ID 可通过数据库网站(如 db.heitu.org)查询
- 支持全部 60/70/80 级版本客户端(112/114/243/253/343)
常见问题
问题1:按教程操作之后不好使
首先把黑兔软件版本升级到最新,然后检查下宏里面的技能ID是否正确,不要直接复制就用,例子里面的技能ID是80级骑士的。
问题2:如果我好几个职业想用一键奶怎么办
无需任何操作! 宏已内置全职业自动识别,会根据 GetMeInfo().classId 自动切换对应职业的技能配置。你只需要确保各职业分支中的技能 ID 正确即可。
问题3:怎么取消正在读条的治疗
当目标已经满血(比如被其他治疗顶满),再次按下宏即可自动取消当前施法。这是通过 SpellStopCasting() 实现的,可以帮你节省法力。