LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
查看: 16497|回复: 14

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

[复制链接]
发表于 2016-7-15 16:31:47 | 显示全部楼层 |阅读模式
本帖最后由 玄月无尘 于 2016-7-15 16:46 编辑

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

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

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

  1. function xr_OnLoad()
  2.   if not xrF then
  3.     xrF = CreateFrame("Frame");
  4.     xrF:SetScript("OnUpdate", xr_OnUpdate);
  5.     xrF:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
  6.     xrF:SetScript("OnEvent",xrF_OnEvent);
  7.   end
  8. end

  9. function xrF_OnEvent(self,event,...)
  10.   
  11.     local subEvent
  12.     local sourceGUID
  13.     local sourceName  
  14.     local destGUID
  15.     local destName
  16.     local destFlags
  17.     local destRaidFlags
  18.     local spellID
  19.     local spellName  
  20.     local auraType
  21.     local extraSpellName
  22.     local auraType2

  23.           if event == "COMBAT_LOG_EVENT_UNFILTERED" then
  24.     subEvent    = select(2,...)
  25.     sourceGUID = select(4,...)
  26.     sourceName    = select(5,...)
  27.     destGUID    = select(8,...)
  28.     destName = select(9,...)
  29.     destFlags = select(10,...)
  30.     destRaidFlags = select(11,...)
  31.     spellID = select(12,...)
  32.     spellName   = select(13,...)
  33.     auraType = select(15,...)
  34.     extraSpellName = select(16,...)
  35.     auraType2 = select(18,...)
  36. end
  37.         
  38.     if subEvent == "SWING_DAMAGE" and sourceName == UnitName("player") then
  39.       swingtimer = GetTime()
  40.       swingtimer = (GetTime() + UnitAttackSpeed("player") - getLatency())
  41.     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 end
end
if (swingtimer ~= nil and swingtimer > GetTime()) or UnitPower("player") > 78 then
    if castSpell("player",71,true,false) then end
end

以上代码已经过测试,非常好用。在PVP战斗中,如果情况非常紧急,可以加入嘲讽的代码来解除姿态GCD。


回复

使用道具 举报

发表于 2016-7-15 16:58:15 | 显示全部楼层
好久不见啊
回复 支持 反对

使用道具 举报

发表于 2016-7-15 22:59:44 | 显示全部楼层
这个好厉害
回复 支持 反对

使用道具 举报

发表于 2016-7-16 09:45:04 | 显示全部楼层
大神出手  不同凡响 这个实现必须技术流啊
回复 支持 反对

使用道具 举报

发表于 2016-7-16 17:48:30 | 显示全部楼层
这个代码用什么插件运行呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-17 15:48:00 | 显示全部楼层
zyhhll1988 发表于 2016-7-16 17:48
这个代码用什么插件运行呢

任何插件都可以,其实所有插件只是表面不一样,里子都是一样的。
回复 支持 反对

使用道具 举报

发表于 2016-7-22 12:25:40 | 显示全部楼层
老大又回来玩啦?可惜战士的姿态被砍了~~
回复 支持 反对

使用道具 举报

发表于 2017-3-31 10:43:07 | 显示全部楼层
公共CD和延迟都有影响。
回复 支持 反对

使用道具 举报

发表于 2017-4-11 14:14:33 | 显示全部楼层
这个做不到吧。。。技能呢
回复 支持 反对

使用道具 举报

发表于 2017-4-29 00:13:31 | 显示全部楼层
谢谢!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 03:18 AM , Processed in 0.270971 second(s), 35 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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