LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
查看: 831|回复: 57

简化版的WBE实现

  [复制链接]
发表于 2025-7-28 13:53:50 | 显示全部楼层 |阅读模式
最近写了一个插件,准备将自动输出功能集成进来,下面是模拟WBE实现的一些方法,不全,仅够自己用,如果需要其他的自行添加。

(这里只提供了方法签名,具体源码见附件)
[Lua] 纯文本查看 复制代码
AutoCombatUtils = {};

local Lib = AutoCombatUtils;


---返回公共CD的剩余冷却时间
function Lib.GCD() end

---返回指定技能的剩余冷却时间
function Lib.CD(spellIdOrName) end

---尝试释放技能,成功返回true,失败返回false
---@param spell string|number 技能ID或名称或者宏
---@param unit string|nil 技能施放目标
---@param delay number|nil 该技能下一次是否需要延迟释放
---@return boolean 成功返回true,失败返回false
function Lib.Run(spell, unit, delay) end

---获取指定单位的血量
---@param unit string 要获取血量的目标单位
---@param p number|boolean|nil 如果不为nil则返回百分比
---@param q number|boolean|nil 如果不为nil则返回损失的血量而非剩下的血量
function Lib.UnitHealth(unit, p, q) end

---获取指定单位的buff列表
---@param unit string 要获取buff的目标单位,如果不传则获取玩家自己的buff列表
function Lib.UnitBuffList(unit) end

---获取玩家身上指定buff的层数
---@param spellIdOrName string|number buff的名字或ID
---@param fullMatch boolean|nil 如果spellIdOrName是名字,则在buff名字匹配的时候是否完整匹配,默认为true
---@return number
function Lib.PlayerBuffCount(spellIdOrName, fullMatch) end

---获取玩家身上指定buff的剩余事件
---@param spellIdOrName string|number buff的名字或ID
function Lib.PlayerBuffTime(spellIdOrName) end

---获取玩家身上指定debuff的剩余时间
---@param spellIdOrName string|number debuff的名字或ID
function Lib.PlayerDeBuffTime(spellIdOrName) end

---判断玩家身上是否有指定的buff
---@param spellIdOrName string|number buff的名字或ID
function Lib.PlayerHasBuff(spellIdOrName) end

---判断玩家身上是否有指定的debuff
---@param spellIdOrName string|number debuff的名字或ID
function Lib.PlayerHasDeBuff(spellIdOrName) end

---判断某个单位身上是否有指定的buff
---@param unit string 要判断的单位
---@param spellIdOrName string|number buff的名字或ID
function Lib.UnitHasBuff(unit, spellIdOrName) end

---获取某个单位身上指定buff的剩余时间
---@param unit string 要判断的单位
---@param spellIdOrName string|number buff的名字或ID
function Lib.UnitBuffTime(unit, spellIdOrName) end

---判断某个单位身上是否有指定的debuff
---@param unit string 要判断的单位
---@param spellIdOrName string|number debuff的名字或ID
function Lib.UnitHasDeBuff(unit, spellIdOrName) end

---获取某个单位身上指定debuff的剩余时间
---@param unit string 要判断的单位
---@param spellIdOrName string|number debuff的名字或ID
function Lib.UnitDeBuffTime(unit, spellIdOrName) end

---检查是否有指定类型的debuff
---@param types string|table Magic, Disease, Poison, Curse 分别对应: 魔法、疾病、毒药、诅咒
function Lib.PlayerHasDeBuffType(types) end

---是否正在切换地图
function Lib.MapLoading() end

---是否在战斗中
function Lib.InCombat() end

---返回周围怪物的数量
---这个只是粗略的统计,只统计攻击自己或队友的怪物
function Lib.EnemyCount() end

---开启自动攻击
function Lib.Startattack() end

---停止自动攻击
function Lib.Stopattack() end

--- 获取玩家和指定单位之间的距离
--- 注意:这个不是精确的距离,而是最小距离和最大距离中的最大距离
function Lib.GetRange(unit) end

---获取目标正在读条的法术名称
---@param unit string 目标单位
---@param interrupt number|boolean|nil 是否只返回可以打断的技能
function Lib.UnitCastSpellName(unit, interrupt) end

--- 通过名字判断是否学习了指定的法术
---@param nameOrId string|number 法术名字或法术ID
---@param isPet boolean 是否是宠物法术
---@return boolean
function Lib.IsSpellKnown(nameOrId, isPet) end

---通过符文名字获取符文的ID
---@param rune string 符文名字
---@return number 符文的ID
function Lib.GetRuneId(rune) end

---获得指定符文的数量
---正常是每种符文都是两枚,有些时候会出现多枚的情况
---@param rune string|number 符文ID或符文名字
---@return number 符文的数量
function Lib.GetRuneCount(rune) end

---返回某种符文可用数量及冷却时间。
---@param rune string|number 符文名字或符文ID
---@return number, number, number 可用数量,第一枚符文的冷却时间,第二枚符文的冷却时间
function Lib.GetRune(rune) end

---判断是否有指定的符文
---@param runes string|table 可以传多个符文(以逗号分隔),只要有一个存在就返回true
---@return boolean
function Lib.HasRune(runes) end






下面是使用该工具写的一个骑士脚本(这里只是介绍如何使用这个工具,qs的具体输出逻辑不用关心):

[Lua] 纯文本查看 复制代码
-------------------------------------------------------
-- 圣骑士输出脚本
-------------------------------------------------------
PaladinAutoCombatScript = {};
local Lib = PaladinAutoCombatScript;

-- 注册一个SPELLS_CHANGED事件,当法术发生变动(学会了新法术或遗忘了某个法术)时调用该方法更新学会的法术
function Lib:OnSpellChanged()
    -- 是否学习了命令圣印
    self.HasSealOfCommand = IsSpellKnown(20375);
    -- 是否学习了十字军打击
    self.HasCrusaderStrike = IsSpellKnown(35395);
    -- 是否学习了神圣风暴
    self.HasDivineStorm = IsSpellKnown(53385);
    -- 是否学习了正义之锤
    self.HasHammerOfTheRighteous = IsSpellKnown(53595);
    -- 是否学习了光环掌握
    self.HasAuraMastery = IsSpellKnown(31821);
end

-- 攻击函数
function Lib:OnAttack()
    local combat = AutoCombatUtils;
    local health = combat.UnitHealth("player", "%");

    -- 圣洁护盾(buff持续30秒,技能无CD,可以全程开着)
    if not combat.PlayerHasBuff("圣洁护盾") and combat.Run("圣洁护盾", "player", 1) then
        return;
    end

    -- 神圣恳求(减伤效果,需要神圣恳求雕文)
    if health <= 85 and
       not combat.PlayerHasBuff("神圣恳求") and
       combat.Run("神圣恳求", nil, 1)
    then
        return;
    end

    -- 有拯救之手雕文时对自己使用有20%减伤
    if health <= 75 and
       not combat.PlayerHasBuff("拯救之手") and
       combat.Run("拯救之手", "player", 1)
    then
        return;
    end

    -- 圣疗术
    if health <= 50 and
       not combat.PlayerHasDeBuff("自律") and
       combat.Run("圣疗术", "target", 600)
    then
        return;
    end

    -- 正义之怒,天赋有减伤
    if not combat.PlayerHasBuff("正义之怒") and combat.Run("正义之怒") then
        return;
    end

    -- 虔诚光环(当前服务不能用惩戒光环)
    if not combat.PlayerHasBuff("虔诚光环") and combat.Run("虔诚光环") then
        return;
    end

    -- 命令圣印(天赋没点命令圣印就加光明圣印)
    if Lib.SealOfCommandAvailable then
        if self.HasSealOfCommand then
            if not combat.PlayerHasBuff("命令圣印") and combat.Run("命令圣印") then
                return;
            end
        elseif not combat.PlayerHasBuff("光明圣印") and combat.Run("光明圣印") then
            return;
        end
    end

    -- 强效王者祝福
    if not combat.PlayerHasBuff("强效王者祝福") and combat.Run("强效王者祝福") then
        return;
    end

    -- 目标不在近战(十字军打击)范围内时,只尝试释放审判和驱邪术
    if self.HasCrusaderStrike and IsSpellInRange("十字军打击", "target") ~= 1 then
        if IsSpellInRange("驱邪术", "target") == 1 and combat.Run("驱邪术", "target", 1) then
            return;
        end
        if IsSpellInRange("圣光审判", "target") == 1 and combat.Run("圣光审判", "target", 0.5) then
            return;
        end
        return;
    end

    -- 解魔法
    if combat.PlayerHasDeBuffType("Magic") and combat.Run("清洁术", "player", 1) then
        return;
    end

    -- 解疾病和中毒
    if combat.PlayerHasDeBuffType("Disease,Poison") and
       (combat.Run("清洁术", "player", 1) or combat.Run("纯净术", "player", 1))
    then
        return;
    end

    --开启自动攻击
    combat.Startattack();

    -- 目标有无敌buff时不用技能,只平砍
    if combat.UnitHasBuff("target", 1100006) then
        return;
    end

    if combat.GCD() > 0 then
        return;
    end

    -- 光环掌握
    if self.HasAuraMastery and
       combat.UnitHealth("target", "%") < 100 and
       combat.Run("光环掌握", nil, 1)
    then
        return;
    end

    -- 复仇之怒
    if IsUsableSpell("复仇之怒") and combat.Run("复仇之怒", nil, 1) then
        return;
    end

    -- 神圣愤怒
    if combat.Run("神圣愤怒", nil, 1) then
        return;
    end

    -- 战争艺术(触发的buff),有这个buff后可以瞬发圣光闪现或驱邪术
    if combat.PlayerHasBuff("战争艺术") and combat.Run("驱邪术", "target", 0.5) then
        return;
    end

    -- 愤怒之锤
    if IsUsableSpell("愤怒之锤") and combat.Run("愤怒之锤", "target", 0.5) then
        return;
    end

    -- 神圣风暴(该技能有内置CD,即便是CD好了也要间隔10秒才能施放)
    if self.HasDivineStorm and combat.Run("神圣风暴", nil, 10) then
        return;
    end

    -- 十字军打击
    if self.HasCrusaderStrike and combat.Run("十字军打击", "target", 0.5) then
        return;
    end

    -- 圣光审判
    if combat.Run("圣光审判", "target", 0.5) then
        return;
    end

    -- 正义之锤(需要装备单手近战武器)
    if self.HasHammerOfTheRighteous and
       IsUsableSpell("正义之锤") and
       combat.Run("正义之锤", "target", 0.5)
    then
        return;
    end

    -- 奉献
    if combat.Run("奉献", nil, 0.5) then
        return;
    end
end




AutoCombatUtils源码:

游客,如果您要查看本帖隐藏内容请回复




本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2025-7-28 20:40:03 | 显示全部楼层
哇塞,牛x的啊,标记下!!!
回复 支持 反对

使用道具 举报

发表于 2025-7-28 23:00:34 | 显示全部楼层
感谢大佬分享,,大佬 6666666
回复 支持 反对

使用道具 举报

发表于 2025-7-29 00:00:01 | 显示全部楼层
太牛了 做个标记 以后学习
回复 支持 反对

使用道具 举报

发表于 2025-7-29 09:36:54 | 显示全部楼层
学习下,看看大佬的作品
回复 支持 反对

使用道具 举报

发表于 2025-7-29 10:34:44 | 显示全部楼层
感谢大佬分享,,大佬 666
回复 支持 反对

使用道具 举报

发表于 2025-7-29 11:15:14 | 显示全部楼层
哇塞,牛x啊  我记住你了............
回复 支持 反对

使用道具 举报

发表于 2025-7-29 13:37:49 | 显示全部楼层
需要学习的东西太多了,感谢大佬 !!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2025-7-29 14:04:28 | 显示全部楼层
大佬666666666666666666666666
回复 支持 反对

使用道具 举报

发表于 2025-7-29 14:36:32 | 显示全部楼层
太牛了,果然高手在论坛呀
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-3 06:20 AM , Processed in 0.106035 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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