隐幻杀的 DK 狂砍 WA
视频教程:https://www.bilibili.com/video/BV1m5fTYXEV3
此宏仅适用于强化绿脸天打邪 DK 的常规单体循环输出,如果希望使用其他天赋或者是多目标输出,请自行修改。
根据 vestiges 哀冬大佬制作的 WA 改编而成,疯狂点击 WA 标识区域即可实现序列施法。
该 WA 利用了目前魔兽世界 Lua 安全框架的漏洞,在游戏内部做到了战斗中使用代码逻辑判断技能释放条件。
使用效果接近外挂,希望官方能够早日修复。
原帖地址:https://nga.178.com/read.php?tid=43583706
!WA:2!TQvxWTX11zbH6y5T1EKyKyLKDDxdxZbGcMIKIwXIvu2a8htAX)8cizhXWsSy3lWUwa7UE3f8h5PtT44ilh3e7q16oXUTjM1tsJhp1oCstLJSv7OM(qvDvpHTjtN(uhncKsV0zQEip3Z9ExaUaybfTs5Oz0I79839C)UNZ5UNn0jBXj7t0rxD3XrAPylQTOE(hE1SYkNw120QFZcM2pB4WHNmCND8el7AQmlX2r30yhZ(ZUEwtBvIDspsT2zYc6N5mY2QIPnnl4QBTQCjxnt7jSCrgCeYYPxZEHjYLZH4(53)kYgkibtAQB4MT)bhp9GslZjkL(zi3Zv4pZP((wH)lUffkuOW2ZZNr9(8yAq18eRDL6LkjBtehQuHcIpVMUlXwwHzahwYXv22viPUHURq2C4)5OjSORTE(84IA)Tz7945wwLKTuUCPxWIyp8GJo5qNy0KU4pKKlzl39IowKcfgr1r46oLYsMLy4McPwF(vMP)ePsptQ0jKsNSeQKSwfKxGylzixK4iiXin7We5cUAvzDsBcYQuQjhC0rxQKHNjiSSnjpA0utqkVTzjRBJ(iITHCHtY3aUWk6g5mTlktxBcljBOZF8Wqldb7lPHPb5kezhskxBIrExT7Dvv04PumdDPy7qumnuDwKsdvlWbswuw3a5foae)EHhh6aoi(4URFKi6Qw7(wVZBv(tU0A)fVY6VZRoWXx)nwC9V33uYrrUaj8k5SXLlQwzx5W3MVdpeDiQwYMQFPbhCCj5cwAYH7UKU6kYpz0HlMF2H6jzrVT4rmWD1WlJEijMtWryjhsHCmyciSm1U15qQKfmLvhkPdIwAvQyje0jKe3DuAfEkbjLcYoo0NY6I2LHl7rK5C65fArP9Z3l6wDlOBGiStKE0rgFWL1XztzwYwH8qBd(sT)2W(K0nSk5AxYHmaXrrtAoDvxT7bnYCYO22E3NMSWsu32yYk2MjP7ZlDJlEPB8zxO8FZBMTaZXVNLyggvrzwcf0OSr1qHdpdmSgmY9ap72HXU96FNp7wFWF9n(K3y939Yi3WXxXrtNuqLjAyI9atMbEoTvu1DOOQ0K5D3(QoAYQMZ9v5NdqBEhHG7dewvbp)HJBKAoDlsglrF8mdhZmJ1mU6fjE)kK1ovk54AwKsXjSuLDjWJCLksHESslj13Kb2Zd0g063hn9h(64szg5cZjVGd6FizGhc(DGhz5(RU5apk87bpOWIu6OhgYaIcWdd)UWVnSx4XeS2f9y5SK0Ca)yMQKpCBwrAUPw0uDgetHAk6fU9PjeRe0DAxjkMwdANJ7Rf725DgnlPujcxiiMWY4rrI6Zt3KF1FlmkGJSl9qdrZ6bd0W4pirTp1K5mnCT25q26Nr85kjRsX)IPtd9U)wH9TkcMPXuPhLnuZQr0ZR5Ew4bcb992uqXmgyWaBnijcsB7FkZVidKOTSo6g5lqwzGbtKE4Jp(ipZWPre8YuQ5aAngNmyEg22blW0PnW9mn4PPW9L3yKDmFE4y0XG(BdszL5rD0mNZLhOw0p2t4GisWQif1joLIMSHbbXU5Nw4GkYoU4qMfZk7oT4A)4lv(B8ULp)5w7V9SEZ5xmWOZh6L8RKMi3EVXp99U5R81l)()GYN7D9uId5LkrmuiI2eex33tEqUoflFUpU85(7U5p47V23(IXx7D(Zk)z)O1E9lu(1Uu8BTYF(nFVxX7hR9x(r38T(wLFT34wV7pjE53)hU(zVS3muA(jRS2kx8MF9lhFlkTMlGA1JFPDR)QVB5p(I36d)umY4n(KFunSvXp(08Kdtl(i(Ld1lHjPKDDr0IWbTW0BKCedh8Kc7xvMqbdSskqZhvZgH1orCqc1xepntujySJ51wKIlP5t3xwhwSTS6fTmTDHdh2l(XlWJFegg5SWHcxVi0rWuBWPwCom28ZBlBT4Z79a87dcjpJPzXqwpAZp2Aztu0PjScBDGMtL6cyStDLzC1WTCnmUZcWUWt0cWxUTLunNHhDktw()pFR)kgUoblV(O6O3SpXxwqe)lc3lU(N(9w)s)PrIlY(7XFCXU8M9JwQ85(WYVjUpTKVz7MpRF4RVzpeFwV46x(dw)B9r(MThH)qbbLs220YaOwfAlrIuzeUjoIHkzEC8EeqVXS6MLCQFCmBCjBD3fgt2qgJgYYxIt0VnbJ(W(v0iS)d1CKuY5ijDn8Ofh5eJmPmvB05OcImSSHAbSkkeUqstkIoDxsKybQLogCECuxQ2QHxVHdMh62FkfBDlQNpxjd2QjknjDCrw6)4IoSPJlIR4KMQlGpy64sFkgEQgJQAuR62qIrRtaCPgGyigQbBDPiUShKi5QFv5BQa5TxKGeUyryzX1E0iJvj1o6KPN1MHymBh8si6OAA)yBfjLAJC5bilFz6JjeS482pMAkbVHXLg11iWHsyrTQy00rPHuWzm0lG1BIhQ9oJ4B4(1ikN23Wo0XjZ5kJ1RenMGgMzI4GLLQBsTboHijDH2vdh68XxDtovxttpiuZXXgOPBon(pu2anhAAVfAVpttDOnQ9EAcxBSHI(z(9cOLL24YP258wnmTeP(56EtMJz9ryj9AyUE8pNGPrJBK9xqx50irt1xFtjONtmAWBohd3DIjIa8MrWr7t8ihjMORgXGflRrnvhALEdbkmTwdoqHpDSTMi5(h84CD7uBMqXL8wYee7RQJKTiffe9(7oAwmUCXesFbnnAWhsbhYxi)PNnYLatBJZJZJjmU7Swk)CXzzJ3okAeITTPnQbQ9nDF9nnfyvFGGAGvE(5TiYH(xtJq0zNvDnvuD9bBAq1fmXlnkQ7LiSJo6W3OkuMRe6QHWwtXyAAVfqZoAWf9wCfWOT21W04YGBnyIh2fBIJ5VW8PybzdXtuv5NtwLaVxmrCrV30bk6Qr853RNgwIDFwmudx8SBwgxKFZGGzGwexv6lIvrqW7)QCAID144VmwlcwyL3Pgw5fvofZqA6gI6wY62orRdRhtu1ex2178Rn7rnvJKSKRRPbfux)otKo6OwdOHYt8W5mj4R8e2PIMKkTsw7OnQU4nyRCrv)O9sFBcyrT2dzYXHorJKWyHbWlhfPjCGkEsBtl58Obog1H7Xh9gVBcl4fYsRH30lVgFnIksIUT65ZAoNSv5O4vble1NhuSDXUfpagJV5AKbL(cGq7e)xZfhdOvdGCt2C8kmjQdgLYiFh866Jo1uvpTXXtY1uX7JPw301Cw3t(um)MSVhRQiAm2GpTrZYUH0z8m90X9BpX4sQ5lrFfNwV7cX0tyWqf0qY15cQSoKkzeTjXcJJUIyBI945DmN17uEWxkWBRSkvnf4MtgZzfi1BnmBn845sqhatfSdsX346avl0hdMge7nhShOb(RbeVwRUjG7gdO2akQQCyPxf8dSRR(7MeQSXe8r26HhVZHgdu8nAFvQUTMcnco44jSIei1BEGXMWWDeIfmF(WjD3zNnv63D4JGfwqyKnn43u(RMjBTyHaJMfWwvZkKgfHFjILK0eJXxyQgxw1eOQ(qtn5QhXOQYdMB34TjBciV(Yn))viEaz)R3YIju)iBEM)gOEZb3bs(DeAhex(a2Drb2bk57oyDqI6xpqntI3njOd41qSHS2sG56xmBkuoWl74hiN1e3skY3yAoioPpQ(caG9l87us4gO9ocIQNd)aOaK3Dh0PEXeeSPEA2KR6UjK6)2Sr8)EVPVCMkLriY7h1ynKDokV)r(EtQC8g9(p68lE4RSPnU5tJ55Px(PATK4DH9UnAFInOH6E7cB9Ily3Pe31VJ8UrvlvUgA132GHkSBbRDxPTC03I(a6o03xLQMn911RNBHKJo4qPHW7y2FgTnTpAv4ND0YF6pT8F8BV(L(7V5REXYV)pCTx)c3AXpyGJhZQTM)w5lqYlRSWm5kyAARz1cfb7P8XmvLy9IRh4jUULTzE8mQdV1PT)qBB7WxzLX1EXIto5zIMU48yrX0VAaI21LlHybe1PWAXwYe4pxH3dInARpCuHfRSgZuPDNJOyAS3T)B8)E(4Wq0EZk41Qt4KzGVQwLEfiGoiypx8lT9knPeMYRVKWxZRDKW011hskPSEuAxYGOrzYAx0FMNyqS1vsPzo3egzGhXAxdGbk0epUb7c6yWgckRRxHtN(nlz4Mjj95qSrZIEnvkzoA1Po4nZWmU3cfl8TPw0sAWfcd)j1r4BxLkPjnNJyJuUKf9b6zS7hUqik5Rs1v1rZSb35qU3)TXzhCEehNI)nlKHXcUfG3JXHV2wM2JUeSg5Ef6lDG9Mb0vD2VuphP7U72VDVpj2KOjTAnUh4DyIfJKwivL3k1v83nLvR2Ds6uzwQ6J74Fyi01UVkWkXj9GsIrzckgRdNU2ymHkRmkI4fzXgML0TSXcWFWhUni6fGxJH7UBBdmOOTiglI99rec6T9wX51o)UTAHgEAMAAtwiR9Xg0135fhVhGdSu15I8yow70h7BGWVoF0kFsdjtCI0ty9Lzdw7be4nUnxlv7k9zxL)bv41Y)qxHnV3HFqyz2AGqpkNC8jgFqyF2oLYsPzzgHvB2D4L8mFdxiFnRYksEv2yvA6hCgUMMv3rhd4KXBL5773XAxJm(4dkntYjsNEIXKODRE1Q6G1(rpt)fQrb0zzF(jdc6Nnl381G(Yb4zUnAgErnirBWPHc0(xZ6STxVSD0yEimHm1kPFebw7U)rtm2KPNi5Oj6)4jgyGrspYjheoxMSf1PVBunyEnOnBpUwI(rAOs5tcdDo(aqgn4BMbovg4FmBxh(jo8HoeiZ8xWlhc6xOsK1fL8Wk8wMsJcchomg17uMFLN055o(yzN7zHxxdoRgTjPWrFX2KyV4GHGwJVTfNv2wNg2U7eJpqetRi91xw2SoTJZFpWvZ6qtc6WNsAw5cLiTGy4wVp4QsSt60zowFW1I0tN20oPNN40EBW1E2Wd)uNFV79P322chk8IyuzlAqbqgNQv4pY6bBAM0UIb)8L59wvbDfTb)ZmdfUk8VWnc4Z9mn4FfUwlDYhKBrW)gZoWHA5OaWmJqOD8X7CNIBdne4NVf0F3O(H)9GuBVEJezcj6qhnyl5WqR3lC1v0DyHOzHMVw4gnpKSFt07s)0UiQW1c5zUO1()C5l)FJw7Wp1)1Po1RSLn7dfKz3YXGpF)utK)81APlMT65zg(P(LN8KzOAyRPIEAMkA3tfuVe3x0f3la)InwzbRo4)SjYSxFY0ZU3qMHpC1Dcu7Cxj8l5JF)Wvx20OsqCCSTG(HycWdeQLz)pEH)Vd
代码精读:
--[[
该代码用于创建一个复杂的技能优先级系统,主要面向魔兽世界怀旧服DK职业的WA插件开发。
通过多层安全框架实现:当多个技能同时可用时,根据预设优先级自动触发最高优先级的技能。
系统包含安全检查层、动作绑定层、重置层等多个逻辑层,并严格遵循暴雪的安全模板规范。
--]]
-- 定义技能/宏动作列表(显示用)
spellActionList = {
"凋零缠绕", -- 1. 高优先级直接伤害技能
"寒冬号角", -- 2. 增益类技能
"白骨之盾", -- 3. 防御类技能(实际由配置决定)
"主体循环", -- 4. 常规输出循环(实际由配置决定)
}
-- 当前技能和动作索引变量
currentSpell = "" -- 当前正在执行的技能名称
currentActionIndex = 4 -- 当前动作索引(默认指向主体循环)
previousActionIndex = 4 -- 上一个动作索引(用于状态恢复)
-- 创建安全管理主框架(使用暴雪安全模板)
-- SecureHandlerStateTemplate 提供受保护的环境,防止非法访问
securityManagerFrame = CreateFrame("Frame", "SafeBtnManager", UIParent, "SecureHandlerStateTemplate")
-- 扩展安全框架功能
securityManagerFrame.Execute = SecureHandlerExecute -- 允许在安全环境执行代码
securityManagerFrame.WrapScript = function(self, frame, script, preBody, postBody)
return SecureHandlerWrapScript(frame, script, self, preBody, postBody) -- 安全包装脚本
end
securityManagerFrame.SetFrameRef = SecureHandlerSetFrameRef -- 安全引用框架
-- 从WA配置获取宏内容
securityManagerFrame:SetAttribute("MainMacro", aura_env.config.mainMacro) -- 主循环宏
securityManagerFrame:SetAttribute("ShieldMacro", aura_env.config.shieldMacro) -- 盾宏
-- 在安全环境中初始化核心逻辑
securityManagerFrame:Execute[[
-- 定义管理器引用
Manager = self -- 指向securityManagerFrame
-- 初始化层级系统
ActionBindingLayer = nil -- 实际执行动作的层
ResetActionLayer = nil -- 重置优先级层
CheckActionLayers = newtable() -- 各优先级检测层集合
highestPriorityAction = 1 -- 当前最高优先级(初始设为1保证首次检测有效)
-- 重构技能/宏列表(包含实际宏内容)
spellActionList = newtable()
spellActionList[1] = "凋零缠绕" -- 直接使用技能名
spellActionList[2] = "寒冬号角" -- 直接使用技能名
spellActionList[3] = self:GetAttribute("ShieldMacro") -- 从配置获取盾宏
spellActionList[4] = self:GetAttribute("MainMacro") -- 从配置获取主循环宏
-- 动作类型对应表(spell=直接施法,macro=执行宏)
actionTypeList = newtable()
actionTypeList[1] = "spell" -- 凋零缠绕是技能
actionTypeList[2] = "spell" -- 寒冬号角是技能
actionTypeList[3] = "macro" -- 白骨之盾使用宏实现
actionTypeList[4] = "macro" -- 主体循环使用宏
-- 动作绑定层点击处理逻辑
onActionBindingLayerClick = [==[
-- 当检测到有效优先级时(1-99为有效范围)
if (highestPriorityAction >= 1) and (highestPriorityAction <= 99) then
-- 设置动作类型(spell/macro)
ActionBindingLayer:SetAttribute("type", actionTypeList[highestPriorityAction])
-- 根据类型设置对应属性
if actionTypeList[highestPriorityAction] == "spell" then
ActionBindingLayer:SetAttribute("spell", spellActionList[highestPriorityAction]) -- 直接设置技能名
else
ActionBindingLayer:SetAttribute("macrotext", spellActionList[highestPriorityAction]) -- 设置宏文本
end
else
-- 异常处理:清空动作并报错
ActionBindingLayer:SetAttribute("type", "macro")
spellName = ""
ActionBindingLayer:SetAttribute("macrotext", spellName)
print("error") -- 在聊天框显示错误信息
end
]==]
-- 重置层点击处理逻辑
onResetActionLayerClick = [==[
-- 将优先级设为100(高于所有检测层)
if (highestPriorityAction <= 99) then
highestPriorityAction = 100 -- 强制重置状态
end
]==]
-- 检测层点击处理逻辑
onCheckActionLayerClick = [==[
local index = ... -- 获取传入的层级索引
local checkLayer = CheckActionLayers[index] -- 获取对应检测层
-- 如果当前最高优先级大于检测层索引(说明发现更高优先级的可执行动作)
if(highestPriorityAction > index) then
highestPriorityAction = index -- 更新最高优先级
end
]==]
]]
-- 获取WA锚点信息
local position, relativeFrame, relativePosition, xOffset, yOffset = aura_env.region:GetPoint()
local width, height = aura_env.region:GetSize()
-- 创建鼠标阻挡层集合
mouseBlockerLayers = {}
-- 遍历创建检测层和阻挡层
for actionIndex, actionName in ipairs(spellActionList) do
-- 创建检测层按钮(使用安全模板)
local checkActionLayer = CreateFrame("Button", "CheckActionLayer".. actionIndex, UIParent, "SecureActionButtonTemplate")
-- 安全框架注册
securityManagerFrame:SetFrameRef("CheckActionLayer", checkActionLayer)
-- 设置点击属性
checkActionLayer:RegisterForClicks("AnyDown") -- 响应所有按下事件
checkActionLayer:SetPropagateMouseClicks(true) -- 允许事件传递
checkActionLayer:SetPassThroughButtons("RightButton") -- 右键直接穿透
-- 层级设置(奇数层级用于交互检测)
checkActionLayer:SetFrameLevel(actionIndex * 2 + 1) -- 层级公式保证检测层在阻挡层之上
-- 定位和尺寸设置(与WA位置完全一致)
checkActionLayer:SetPoint(position, relativeFrame, relativePosition, 0, 0)
checkActionLayer:SetSize(width, height)
-- 在安全环境中注册检测层
securityManagerFrame:Execute(string.format([[
local actionIndex = %d -- 传入动作索引
local checkLayer = Manager:GetFrameRef("CheckActionLayer") -- 获取框架引用
CheckActionLayers[actionIndex] = checkLayer -- 存入检测层集合
]], actionIndex))
-- 包装点击事件处理脚本
securityManagerFrame:WrapScript(checkActionLayer, "OnClick", string.format([[Manager:Run(onCheckActionLayerClick, %d)]], actionIndex))
-- 创建对应的鼠标阻挡层
local coverLayer = CreateFrame("Frame")
coverLayer:SetPropagateMouseClicks(false) -- 阻止鼠标点击传递
coverLayer:SetPassThroughButtons("RightButton") -- 允许右键穿透
coverLayer:SetScript("OnMouseDown", function() return end) -- 空处理函数阻止左键
coverLayer:SetFrameLevel(actionIndex * 2) -- 设置偶数层级(位于检测层下方)
coverLayer:SetPoint(position, relativeFrame, relativePosition, 0, 0)
coverLayer:SetSize(width, height)
mouseBlockerLayers[actionIndex] = coverLayer -- 存入阻挡层集合
end
-- 创建动作绑定层(最终执行层)
local actionBindingLayer = CreateFrame("Button", "ActionBindingLayer", UIParent, "SecureActionButtonTemplate")
securityManagerFrame:SetFrameRef("ActionBindingLayer", actionBindingLayer)
-- 设置绑定层属性
actionBindingLayer:RegisterForClicks("AnyUp") -- 响应按键抬起事件
actionBindingLayer:SetPropagateMouseClicks(true)
actionBindingLayer:SetPassThroughButtons("RightButton")
actionBindingLayer:SetFrameLevel(200) -- 最高层级确保优先接收事件
actionBindingLayer:SetSize(width, height)
-- 在安全环境中注册绑定层
securityManagerFrame:Execute([[
local bindingLayer = Manager:GetFrameRef("ActionBindingLayer")
ActionBindingLayer = bindingLayer -- 关联安全环境变量
]])
-- 绑定点击事件处理
securityManagerFrame:WrapScript(actionBindingLayer, "OnClick", [[Manager:Run(onActionBindingLayerClick)]])
-- 创建重置层(用于重置优先级状态)
local resetActionLayer = CreateFrame("Button", "ResetActionLayer", UIParent, "SecureActionButtonTemplate")
securityManagerFrame:SetFrameRef("CheckActionLayer", resetActionLayer)
-- 设置重置层属性
resetActionLayer:RegisterForClicks("AnyDown")
resetActionLayer:SetPropagateMouseClicks(true)
resetActionLayer:SetPassThroughButtons("RightButton")
resetActionLayer:SetFrameLevel(100) -- 较高层级但低于检测层
resetActionLayer:SetSize(width, height)
-- 在安全环境中注册重置层
securityManagerFrame:Execute([[
local resetLayer = Manager:GetFrameRef("CheckActionLayer")
ResetActionLayer = resetLayer
]])
-- 绑定重置点击事件
securityManagerFrame:WrapScript(resetActionLayer, "OnClick", [[Manager:Run(onResetActionLayerClick)]])
-- 创建底层按钮(始终存在的攻击指令)
local bottomButton = CreateFrame("Button", "BottomButton", UIParent, "SecureActionButtonTemplate")
bottomButton:SetPropagateMouseClicks(false) -- 完全阻止事件传递
bottomButton:SetPassThroughButtons("RightButton")
bottomButton:SetFrameLevel(1) -- 最低层级
bottomButton:SetSize(width, height)
bottomButton:SetAttribute("type", "macro")
bottomButton:SetAttribute("macrotext", "/startattack") -- 始终保持自动攻击
-- 更新鼠标阻挡层函数
function UpdateMouseBlockerLayers(activeActionIndex)
for index, coverLayer in ipairs(mouseBlockerLayers) do
-- 仅激活当前动作对应的阻挡层
if index == activeActionIndex then
coverLayer:SetSize(width, height) -- 显示阻挡层
else
coverLayer:SetSize(0, 0) -- 隐藏其他阻挡层
end
end
end
--[[
系统工作流程:
1. 玩家点击区域时,首先触发最高层级的CheckActionLayer(根据FrameLevel)
2. 每个CheckActionLayer的OnClick会调用onCheckActionLayerClick,更新highestPriorityAction
3. 最终点击事件传递到ActionBindingLayer,根据highestPriorityAction执行对应技能/宏
4. ResetActionLayer用于在需要时重置优先级状态
5. 阻挡层系统确保每次点击只能触发最高优先级的可用技能
6. 底层按钮始终保持自动攻击状态
]]