隐幻杀的 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. 底层按钮始终保持自动攻击状态
]]