玄月无尘 发表于 2016-7-15 16:31:47

战士永远防御姿态但依然获得战斗姿态怒气的函数

本帖最后由 玄月无尘 于 2016-7-15 16:46 编辑

战士的姿态机制让战士这个技能少到可怜的职业有了更多的玩法,而且防御姿态常驻20%减伤的效果更让战士成了PVP里最肉的职业,但是战士的怒气获取只有在战斗姿态下才能大量获得,所以利用战斗记录的函数很好的解决了这个问题。

我要实现的效果就是,如果目标在攻击距离内,并且我的平砍CD已经结束,那么切换到战斗姿态砍一刀,否则,永远防御姿态。

首先写一个战斗记录的提取函数:

function xr_OnLoad()
if not xrF then
    xrF = CreateFrame("Frame");
    xrF:SetScript("OnUpdate", xr_OnUpdate);
    xrF:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
    xrF:SetScript("OnEvent",xrF_OnEvent);
end
end

function xrF_OnEvent(self,event,...)

    local subEvent
    local sourceGUID
    local sourceName
    local destGUID
    local destName
    local destFlags
    local destRaidFlags
    local spellID
    local spellName
    local auraType
    local extraSpellName
    local auraType2

          if event == "COMBAT_LOG_EVENT_UNFILTERED" then
    subEvent    = select(2,...)
    sourceGUID = select(4,...)
    sourceName    = select(5,...)
    destGUID    = select(8,...)
    destName = select(9,...)
    destFlags = select(10,...)
    destRaidFlags = select(11,...)
    spellID = select(12,...)
    spellName   = select(13,...)
    auraType = select(15,...)
    extraSpellName = select(16,...)
    auraType2 = select(18,...)
end
      
    if subEvent == "SWING_DAMAGE" and sourceName == UnitName("player") then
      swingtimer = GetTime()
      swingtimer = (GetTime() + UnitAttackSpeed("player") - getLatency())
    end用xr_OnLoad()这个函数来激活战斗记录提取模块,你可以把这个函数的位置写到你的插件核心层,也可以写到职业脚本层,此模块会大量消耗CPU和内存,建议在大型战场上不要使用。

function xrF_OnEvent(self,event,...)是用来把战斗记录分类的,从中提取你想要的战斗信息点。

下面这段代码用来判定我们的平砍CD是否结束

if subEvent == "SWING_DAMAGE" and sourceName == UnitName("player") then
   swingtimer = (GetTime() + UnitAttackSpeed("player") - getLatency())
end
subEvent == "SWING_DAMAGE"用来表示战斗记录中一次平砍动作。
sourceName == UnitName("player")用来确定这一次平砍动作是由玩家产生的。
swingtimer = (GetTime() + UnitAttackSpeed("player") - getLatency())就是确定平砍CD结束的时间,其中GetTime()用来确认上一次平砍成功的时间,UnitAttackSpeed("player")是玩家的攻击速度,getLatency()是网络延迟函数(这个函数是GH或者BB的,如果你用**插件请相应更改)


完成这些以后,我们可以在脚本中写入下面的函数来实现能平砍一下的时候砍一下,其余时间永远防御姿态:
if swingtimer ~= nil and swingtimer <= GetTime() and getDistance("player","target") <= 4 and getFacing("player","target") and UnitPower("player") <= 78 then    if castSpell("player",2457,true,false) then endendif (swingtimer ~= nil and swingtimer > GetTime()) or UnitPower("player") > 78 then    if castSpell("player",71,true,false) then endend
以上代码已经过测试,非常好用。在PVP战斗中,如果情况非常紧急,可以加入嘲讽的代码来解除姿态GCD。


小小沫涵 发表于 2016-7-15 16:58:15

好久不见啊

扑满 发表于 2016-7-15 22:59:44

这个好厉害{:5_249:}{:5_249:}

xj803 发表于 2016-7-16 09:45:04

大神出手不同凡响 这个实现必须技术流啊

zyhhll1988 发表于 2016-7-16 17:48:30

这个代码用什么插件运行呢

玄月无尘 发表于 2016-7-17 15:48:00

zyhhll1988 发表于 2016-7-16 17:48
这个代码用什么插件运行呢

任何插件都可以,其实所有插件只是表面不一样,里子都是一样的。

jtxx0018 发表于 2016-7-22 12:25:40

老大又回来玩啦?可惜战士的姿态被砍了~~

redyan9985 发表于 2017-3-31 10:43:07

公共CD和延迟都有影响。

solocc 发表于 2017-4-11 14:14:33

这个做不到吧。。。技能呢

今年夏天 发表于 2017-4-29 00:13:31

谢谢!!!!!!!!!!!!!
页: [1] 2
查看完整版本: 战士永远防御姿态但依然获得战斗姿态怒气的函数