魔兽世界三部曲--自动蹲点抓宝宝的思路及实现(一)

2 篇文章 0 订阅
1 篇文章 0 订阅

作为魔兽世界几十年的情怀玩家,自从国服停了以后就转战亚服了,身为一个老猎人的我对收集稀有宝宝情有独钟,比如说狮王休玛,奈何守的人太多,我不可能全天24小时守着,所以决定开发一个自动抓宝宝的插件。

下面我们来理一下实现的思路:

1、如何自动发现指定的宝宝?

2、如何自动的对其施放抓捕技能?

这里是通过魔兽自己API来开发插件实现,怎么创建魔兽插件,各位自己去搜一下比较简单,魔兽插件是Lua语言的,上面的样式我附一下代码:

    local isbeginpet=0 --是否开启抓宝宝0是结束1是开始
    --主界面
    local FeimaoMainFrame =CreateFrame("Frame","FeimaoMainFrame",UIParent,"BasicFrameTemplate");
    FeimaoMainFrame:SetWidth(150);
    FeimaoMainFrame:SetHeight(165);
    FeimaoMainFrame.TitleText:SetText("飞猫工具箱")
    FeimaoMainFrame:SetMovable(true)
    FeimaoMainFrame:SetClampedToScreen(true)
    FeimaoMainFrame:SetScript("OnMouseUp",function()
        FeimaoMainFrame:StopMovingOrSizing();
        editbox:ClearFocus()

    end);
    FeimaoMainFrame:SetScript("OnMouseDown",function ()
        FeimaoMainFrame:StartMoving();
    end);
    FeimaoMainFrame:SetFrameStrata("HIGH");
    FeimaoMainFrame:SetPoint("TOPRIGHT",Minimap,"BOTTOMRIGHT",0,-20);
    FeimaoMainFrame:Show()


    --重载按钮
    local button = CreateFrame("Button","Frame",FeimaoMainFrame,"UIPanelButtonTemplate")
    button:SetSize(130,30)
    button:SetPoint("TOPLEFT",FeimaoMainFrame,"TOPLEFT",8,-38)
    button:SetText("重启插件")
    button:Show()
    button:SetScript("OnClick",function()
            ReloadUI()
        end)

    --文本框
    editbox = CreateFrame("EditBox","Frame",FeimaoMainFrame,"InputBoxTemplate")
    editbox:SetSize(120,30)
    editbox:SetPoint("TOPLEFT",FeimaoMainFrame,"TOPLEFT",12,-118)
    editbox:SetText(petname)
    editbox:Show()
    editbox:SetScript("OnTextChanged",function(self)
        petname=self:GetText()
        end)
    if editbox:IsAutoFocus() then
        editbox:SetAutoFocus(false)
    end

    --抓宝宝
    local button = CreateFrame("Button","Frame",FeimaoMainFrame,"UIPanelButtonTemplate")
    button:SetSize(130,30)
    button:SetPoint("TOPLEFT",FeimaoMainFrame,"TOPLEFT",8,-78)
    button:SetText("开启抓宝宝")
    button:Show()
    button:SetScript("OnClick",function()
        local btn={}
        if isbeginpet==0 then
            editbox:ClearFocus()
            editbox:SetEnabled(false)
            button:SetText("结束抓宝宝")
            isbeginpet=1
            paTexture:SetColorTexture(0.7, 0.7, 0, 1)
        else
            button:SetText("开始抓宝宝")
            isbeginpet=0
            editbox:ClearFocus()
            editbox:SetEnabled(true)
            paTexture:SetColorTexture(0.3, 0.1, 0, 1)
        end
        end)

下面开始进入正题:如何发现指定的宝宝?

魔兽世界开放API本着是让大家开发出多种多样的插件来丰富游戏,想法是好的现实很残酷,被脚本大军工作室弄来快速牟利,破坏了游戏的平衡,所以对部分api限制了开放,无法在插件中直接执行,但它的宏还是可以调用的,比如发现指定的宝宝可以通过:

/target 宠物名称或者宠物的UnitID  
(比如:/target 狮王休玛)

通过这个设定一个宏,触发时当发现目标存在就会锁定到宠物。

那发现指定宝宝的问题解决了,接下来就是怎么让它自动执行技能抓宝宝?

魔兽api里有创建宏按钮的命令,我稍微研究了下,我想创建一个宏按钮又不想它展示在页面上就用这个:

 btn=CreateFrame("Button", "LR1",UIParent, "SecureActionButtonTemplate")
 btn:SetAttribute("type", "macro")
 btn:SetAttribute("macrotext","/cast 驯服野兽")
 SetOverrideBindingClick(btn, false, "ALT-NUMPAD0", btn:GetName())

可以wiki搜下SecureActionButtonTemplate - Warcraft Wiki - Your wiki guide to the World of Warcraft这个框架的用法,上面的代码意思是创建一个LR1的宏按钮,然后通过SetOverrideBindingClick绑定快捷键到ALT+小键盘的0键,此时你在游戏中按ALT+小键盘0,就会施放驯服野兽的技能,由于精力有限,SetOverrideBindingClick这个有5个参数,第5个参数mouseClick不知道怎么用

因为后续技能非常多,我本来的想法是不绑定按键,直接通过找button的名称“LR1”来执行点击这个button,没有找到方法,只有魔兽里的宏命令/click LR1可以执行,但是这样还是绑定N个按键,如果大家有好的方法可以给我说下。

把猎人需要的技能都绑定好按键,我这里是这么写的:

--创建宏
function CreatButtons()
    local marcobind="/cast 驯服野兽@/cast 冰冻陷阱@/castsequence reset=10/target 扰乱射击,驯服野兽@/cast 影遁"  --猎人 0.3-0.4
    bindingLen = { strsplit("@", marcobind) }
    macroindex = 0
    while true do
        macroindex = macroindex + 1
        if (macroindex > #bindingLen) then break end
        local thisMacro = bindingLen[macroindex]
        local bts=CreateFrame("Button", "FM"..macroindex,UIParent, "SecureActionButtonTemplate")
        bts:SetAttribute("type", "macro")
        bts:SetAttribute("macrotext",thisMacro)
        SetOverrideBindingClick(bts, false, "ALT-NUMPAD"..macroindex, bts:GetName())
    end
end

通过@切割创建好技能宏和绑定好按键事件,那这么自动施放呢,之前就说了魔兽对一些动作的API禁用了,只能通过外部的方式,比如按键精灵或者其它,我这里用的是python写的,在魔兽插件中可以判断目标宝宝的出现,然后就通知后台执行抓捕操作,接下来看代码:

    pW = 20;ph = 20;pX = 0;pY = 0;
    pa = CreateFrame("Frame", nil, UIParent)
    pa:SetFrameStrata("TOOLTIP")
    pa:SetWidth(pW)
    pa:SetHeight(ph)
    pa:SetPoint("TOPLEFT", pX, pY)
    paTexture = pa:CreateTexture()
    paTexture:SetPoint("LEFT", 0, 0)
    paTexture:SetColorTexture(0, 0, 0, 1)
    paTexture:SetWidth(pW)
    paTexture:SetHeight(ph)
    paTexture:Show()
    

    在游戏的左上角创建一个色块,大小20X20

原理是我在左上角创建一个色块,游戏插件中根据状态来改变色块的颜色,然后就通知自己的后台执行操作,按对应的按键。

        local btn={}
        if isbeginpet==0 then
            editbox:ClearFocus()
            editbox:SetEnabled(false)
            button:SetText("结束抓宝宝")
            isbeginpet=1
            if (UnitAffectingCombat("player")==false) then
                btn=CreateFrame("Button", "LR"..petname,UIParent, "SecureActionButtonTemplate")
                btn:SetAttribute("type", "macro")
                btn:SetAttribute("macrotext","/target "..petname.."\n/run checkbbmode()")
                SetOverrideBindingClick(btn, false, "ALT-NUMPAD0", btn:GetName())
            else
                print("请脱离战斗后执行!")
            end
            paTexture:SetColorTexture(0.7, 0.7, 0, 1)
        else
            button:SetText("开始抓宝宝")
            isbeginpet=0
            editbox:ClearFocus()
            editbox:SetEnabled(true)
            paTexture:SetColorTexture(0.3, 0.1, 0, 1)
            ClearOverrideBindings(btn)
        end

这一段就是写在抓宝宝的onclick事件中的,点击开始的时候就创建一个按钮,作用是寻找目标宝宝,checkbbmode是我封装的检查状态的方法

--检查猎人是否有宠物栏
    function checkbbmode()
        if (PetHasActionBar()) then
            isNoBB=1
            paTexture:SetColorTexture(0.3, 0.1, 0, 1)
        else
            isNoBB=0
            if isbeginpet==1 then
                local pname,_=UnitName("target")
                if (pname=="狮王休玛") then
                    local name, icon, buffnum, Q2,Q3, Q4, Q5, Q6, Q7, spellId=AuraUtil.FindAuraByName("驯服野兽", "player")
                    if (name=="驯服野兽") then
                          paTexture:SetColorTexture(0.1, 0.1, 0, 1)
                    else
                        paTexture:SetColorTexture(0.3, 0.3, 0, 1)
                    end
            
                else
                    paTexture:SetColorTexture(0.1, 0.1, 0, 1)
                end
            end
        end
    end

这里先判断猎人是否有宠物栏,有就没必要执行抓宝宝了,接下来就是判断选中的目标是不是要找的目标,如果是则执行驯服野兽的技能,还加了检查BUFF的功能,如果驯服野兽在执行中就没必要一直按。

然后自己的后台通过轮询来执行,这里我用的pyautoui来截取游戏屏幕中(0,0,20,20)的色块,然后判断对应的颜色执行对应的按键操作:

import pyautogui

#关键代码
while True:
      im = pyautogui.screenshot(region=(left + 9, top + 38, 20, 20))
      color_RGB = im.getpixel((10, 10))
      if (color_RGB == (77, 77, 0)):
         pyautogui.hotkey('alt', 'num3')
      else
         pyautogui.hotkey('alt', 'num0')

思路就是这么个思路,具体完善就看自己发挥,通过以上当目标宝宝出现时就会自动抓捕,在实际场景中,有很多人在哪里蹲,所以上面我加了起手扰乱拉仇恨,在抓宝宝基本上就是你的了,但是还有现实的原因,因为这里是部落领土,老是被人PK,一直在跑尸中,那如何实现自动释放灵魂、自动寻路、自动复活呢?

这就是下一章要讲的内容了,感谢大家的耐心观看!

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值