LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
查看: 482|回复: 38

用理解代码的思路,让你能够不求人自己解决不限于wowbee问题

[复制链接]
发表于 2023-8-30 10:57:59 | 显示全部楼层 |阅读模式
本帖最后由 贾维斯117 于 2023-8-30 11:02 AM 编辑

如果你不想继续只会下载别人发的配置,啥都不懂改,那么我觉得看下这篇内容还是有帮助的,本篇主要是讲下怎么看懂代码,看得懂才好能去改,就跟考试做题一样。不太算手把手教,只是提供点学习带的思路,还是得自己多思考,多看别人的好代码来学习经验的

1.首先,你得知道一个很常用的逻辑流程。
[Lua] 纯文本查看 复制代码
if AA == 123 then
   xxx
end

意思就是如果AA等于123,那么就运行xxx

[Lua] 纯文本查看 复制代码
if AA == 123 then  --代表如果A等于123就xxx,否则就ccc
        xxx
else
        ccc
end

if AA == 123 then  --代表如果A等于123就xxx,如果等于234就bbb,否则就ccc
        xxx
elseif AA == 234 then
        bbb
else
        ccc
end

这也很简单,不难理解。
有兴趣可以去Lua if 语句 | 菜鸟教程 (runoob.com)细看。
2.再理解下这些:
变量类型:
如果是数值类,则在代码里面直接输入如123,如果是文字类即字符串,则要用英文""包起来,如"治疗波",还有一种叫真假 true of false和是否空白nil。
这个初步知道这回事就好。

API:
API你可以为是函数,或者更简单是命令,如BeeRun这个命令,只要知道了这个命令的意思,直接用就是了。一般API都会有说明表,魔蜂的大部分可以查看说明手册,还有小部分没显示的是在插件代码里如WowBee.Functions.lua,有心思的可以去看看。除了魔蜂API,官方也有很多实用API,去这里看World of Warcraft API - Wowpedia - Your wiki guide to the World of Warcraft (fandom.com),例如UnitName()UnitName - Wowpedia - Your wiki guide to the World of Warcraft (fandom.com),网站里面都有很详细的说明,实在英文苦手就下个edge浏览器的沉浸式翻译插件看。
这里说一下,为什么魔蜂是需要解锁器才能用,因为wow有很多函数是暴雪不给使用的,叫保护函数,这种函数你是没办法直接使用的,解锁器的作用就是解除这个限制,如RunMacroText(macro),JumpOrAscendStart()

好了,懂这3个你基本就能看懂wowbee里面大部分东西了,举个简单的例子
[Lua] 纯文本查看 复制代码
if BeeSpellCoolDown("逃脱")==0 and BeeIsRun("/cast 逃脱") then     --有Bee开头是魔蜂的API,如果没的话一般就是官方API,要去wiki找,不用苦恼不知道意思
        BeeRun("/cast 逃脱")
end

if IsSpellInRange("毒蛇钉刺","target")==1 and UnitExists("target") and not UnitIsDeadOrGhost("target") then
    if BeeTargetDeBuffTime("毒蛇钉刺")<2 then 
        BeeRun("/cast 毒蛇钉刺","target")
        return
    end
end

如果你已经打开了魔蜂手册,api网站,这两段是不是就很容易懂了?例如IsSpellInRange

至于为什么有的加return有的没加return,加了return就是运行到这里后直接返回不再运行下面的代码了,其中一个作用是为了防止共CD技能,重复按了,直接返回,再运行重新运行判断,当然还有很多别的作用。

那么我们再来个难点的例子
[Lua] 纯文本查看 复制代码
-- 获取目标和玩家的buff列表
local Tbl = BeeUnitBuffList("target")
local buff = BeeUnitBuffList("player")
-- 获取玩家当前的生命值百分比和法力值百分比
local Zjxl = BeeUnitHealth("player", "%")
local Zjll = BeeUnitMana("player", "%")
-- 判断玩家是否在战斗状态
local Zdzt = BeeUnitAffectingCombat()
-- 需要屏蔽的buff列表
local Tzsf = "遁影,急救,进食,喝水,幽灵狼,格拉库的肉松蛋糕,点心" 
-- 检查玩家是否有需要屏蔽的buff,有则返回
if BeeStringFind(Tzsf, buff) then
    return
end
-- 检查是否正在施法或者正在引导技能,或者正在施放特定的技能,有则返回
if BeeCastSpellFast() or BeeUnitCastSpellName("player") == "苦修" or BeeUnitCastSpellName("player") == "希望圣歌" or BeeUnitCastSpellName("player") == "神圣赞美诗" then
    return
end
-- 检查玩家是否缺少"心灵之火",没有则释放
if not BeeStringFind("心灵之火", buff) then
    BeeRun("心灵之火")
end
-- 检查玩家是否缺少"真言术:韧"或"坚韧祷言",没有则释放
if not BeeStringFind("真言术:韧,坚韧祷言", buff) then
    BeeRun("真言术:韧", "player")
end
-- 检查玩家是否缺少"神圣之灵"或"精神祷言",没有则释放
if not BeeStringFind("神圣之灵,精神祷言", buff) then
    BeeRun("神圣之灵", "player")
end
-- 检查玩家是否可以释放"心灵专注"和玩家是否含有"争分夺秒"buff,有则释放
if BeeSpellCD("心灵专注") == 0 and BeeStringFind("争分夺秒", buff) then
    BeeRun("心灵专注")
end
-- 检查是否在战斗状态下,法力值低于5%,并且可以释放"希望圣歌",有则释放
if Zdzt and Zjll < 5 and BeeSpellCD("希望圣歌") == 0 then
    BeeRun("/cast [nochanneling] 希望圣歌")
end
-- 检查是否在战斗状态下,法力值低于50%,并且可以释放"暗影恶魔",有则释放
if Zdzt and Zjll < 50 and BeeSpellCD("暗影恶魔") == 0 then
    BeeRun("/cast [target=focustarget] 暗影恶魔")
    BeeRun("/cast [target=targettarget] 暗影恶魔")
    BeeRun("/cast [target=target] 暗影恶魔")
end
-- 检查玩家是否是血精灵,法力值低于90%,并且可以释放"奥术洪流",有则释放
if BeeUnitRace("player", "血精灵") and Zjll < 90 and BeeSpellCD("奥术洪流") == 0 then
    BeeRun("奥术洪流")
    return
end

if Zjxl <= 90 then
    -- 如果生命值低于50%
    if Zjxl <= 50 and BeeSpellCD("绝望祷言") == 0 then
        BeeRun("绝望祷言")
        BeeRun("邪能治疗石")
    end 
    if Zjxl <= 65 and BeeStringFind("争分夺秒", buff) then
        BeeRun("快速治疗", "player")
        BeeRun("邪能治疗石")
    end
    -- 如果没有"真言术:盾"和"虚弱灵魂"buff,释放"真言术:盾"
    if not BeeStringFind("真言术:盾", buff) and not BeeStringFind("虚弱灵魂", buff) then
        BeeRun("真言术:盾", "player")
    end   
    if Zjxl <= 85 and not BeeStringFind("争分夺秒,恢复", buff) then
        BeeRun("恢复", "player")
    end
    return
end

多翻翻看看,好像也能理解了嘛


当然多看论坛里面大佬们的配置是很重要的,因为看懂是一回事,重要的是思路,每个配置都是大佬们一步步写出来的,先学会从大佬们的配置里面学习,再慢慢自己编写适合自己的wb配置。

3.如果你还需要更进一步,那么你得知道什么叫函数function,简单来说,就是用function end包裹的代码。
[Lua] 纯文本查看 复制代码
function BeeUnitCastSpellTime(unit)
    -- 获取指定目标的施法信息
    unit = BeeUnit(unit, "target") -- 获取有效的目标单位
    if not UnitName(unit) then
        return -1, -1, "" -- 如果目标不存在,返回无效值
    end
    -- 获取正在施法的法术信息,local是局部变量的意思,local a,b,c,d,e =UnitCastingInfo(unit),意思是代表UnitCastingInfo会返回很多个返回值,要命名多个变量去接受,不需要的就用_好了
    local spell, _, _, _, startTime, endTime = UnitCastingInfo(unit)
    if spell then
        -- 如果存在正在施法的法术,计算剩余时间和施法持续时间
        local finish = endTime / 1000 - GetTime() -- 剩余时间
        return tonumber(format("%.2f", finish)), tonumber(format("%.2f", (endTime - startTime) / 1000)), spell  --return后面加东西,代表运行函数后,最后返回给上家的返回值,如上面的UnitCastingInfo,就是在内部运行后,返回出很多个变量回来
    end
    -- 获取正在引导的法术信息
    local spellch, _, _, _, startTime, endTimech = UnitChannelInfo(unit)
    if spellch then
        -- 如果存在正在引导的法术,计算剩余时间和引导持续时间
        local finishch = endTimech / 1000 - GetTime() -- 剩余时间
        return tonumber(format("%.2f", finishch)), tonumber(format("%.2f", (endTimech - startTime) / 1000)), spellch
    end
    return -1, -1, "" -- 如果没有正在施法或引导的法术,返回无效值
end

这是从WowBee.Functions.lua里面复制出来的,你用BeeUnitCastSpellTime的时候,实际里面就是这样操作,看着注释慢慢看,别被一大串英文代码懵逼了,至于一些如tonumber format之类的,自己去翻翻Lua教程,我就不多说了。
这时候其实你就可以学会自己去修改了一些出错的地方了,一般的插件包都有出错提示收集框,wowbee也自带了一个简单的判断,如图

这个代表WowBee.Functions.lua里面第4814行出问题了,去翻翻代码把这个改掉就好(建议下个notepad++或者notepad-之类的文本编辑器,打开能显示行数,还能改为黑底白字,选上lua语言格式显示,假装IT狗




这个代表第四行 123那里出错了,改掉。

4.看到这里,你基本就可以自己去封装自己的函数或者去稍微修补下你想要但是出错的插件了。
我这个里面就封装了一些函数,有兴趣可以看看wowbee 修复脚本图标,修复右键创建宏功能,增加多个便捷命令-LUACN论坛 - Powered by Discuz!
甚至可以修改自己想要的插件,例如这个我自己改的
[Lua] 纯文本查看 复制代码
function General:CombatStatusEvent(event)
    if not UnitAffectingCombat("player") then
                --print("out of combat")
                self:HideFramesOutOfCombat()
        else
                --print("combat")
                self:HideFramesOutOfCombat(true)
        end
end

function General:HideFramesOutOfCombat(forceShow)
    local hide = db.general.hideOutOfCombat   ---是否战斗后隐藏
    local opacity = db.general.hideOutOfCombatOpacity   ---隐藏百分比
        local FullHP = db.general.hideOutOfCombatWithFullHP   ---是否满HP隐藏
        --print ("AllFramesIterator",",hide:",hide,',forceShow',forceShow,',UnitExists"',UnitExists("target"),",FullHP:",FullHP,'UnitHP("player")',UnitHP("player"))
    AllFramesIterator(function(frame)
        if (hide and not forceShow and not UnitExists("target")) then  --如果需要隐藏并且没有强制要求显示
            if not FullHP then
                                frame:SetAlpha(opacity)   --设置隐藏的百分比
                        elseif UnitHP("player") >= 100 then
                                frame:SetAlpha(opacity)  
                        else
                                if frame:GetAlpha() < 1 then
                                        frame:SetAlpha(1)
                                end
                        end
                else
                        if frame:GetAlpha() < 1 then
                                frame:SetAlpha(1)
                        end
                        if UnitHP("player") >= 100 then
                                if (frame.__hiddenByAddon__) then
                                        frame:Show()
                                end
                        end
        end
    end)

    if (hide and not registeredCombatEvent) then
        self:RegisterEvent("PLAYER_REGEN_DISABLED", "CombatStatusEvent")
        self:RegisterEvent("PLAYER_REGEN_ENABLED", "CombatStatusEvent")
                self:RegisterEvent("UNIT_HEALTH", "CombatStatusEvent")
                self:RegisterEvent("UNIT_MAXHEALTH", "CombatStatusEvent")
                self:RegisterEvent("UNIT_STATS", "CombatStatusEvent")
                self:RegisterEvent("PLAYER_TARGET_CHANGED", "CombatStatusEvent")
    end
end


原来的EasyFrames插件隐藏功能不好用,我自己加上脱战后选择目标和没满血继续显示框。源码你自己找个EasyFrames就能比对比对,还能改改血量样式之类的,调调位置,都很简单。

5.更进一步,你得学会事件,至于事件的教学,综合教程区很多,你们可以看看,我就不再说了,大佬们说得很详细。
再说一点点:
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入我们

x

评分

参与人数 2伸手费 +600 收起 理由
老血 + 500 期待第二季
vshrd + 100

查看全部评分

回复

使用道具 举报

发表于 2023-8-30 12:00:11 | 显示全部楼层
很好的教学贴,谢谢大佬啊
回复 支持 0 反对 1

使用道具 举报

发表于 2023-8-30 13:52:10 | 显示全部楼层
看看
回复 支持 反对

使用道具 举报

发表于 2023-8-30 14:52:37 来自手机 | 显示全部楼层
很好很好很好
哈哈哈哈哈
回复 支持 反对

使用道具 举报

发表于 2023-8-30 14:55:48 | 显示全部楼层
f非常棒的教学贴,学到了很多,感谢
回复 支持 反对

使用道具 举报

发表于 2023-8-30 19:25:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2023-8-30 21:46:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2023-8-31 17:30:57 | 显示全部楼层
这个真的是非常好的一个教学帖子了,好好学习,天天向上
回复 支持 反对

使用道具 举报

发表于 2023-9-1 11:44:27 | 显示全部楼层
说好的第二季呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-1 16:39:46 来自手机 | 显示全部楼层
老血 发表于 2023-9-1 11:44 AM
说好的第二季呢

谁帮我定的第二季⊙_⊙
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2024-5-4 10:07 AM , Processed in 0.098709 second(s), 39 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表