如何判断spellcasting done
正在制作一个非常简单的提示,就是类似casting bar的东西,但是遇到如下问题:2个判断
elseif (event == "UNIT_SPELLCAST_CHANNEL_START" or event == "UNIT_SPELLCAST_START" )then
用于判断开始cast,
elseif ( event == "UNIT_SPELLCAST_CHANNEL_STOP" or event == "UNIT_SPELLCAST_STOP" )then
用于判断停止cast,
但是实际情况是,经常target停止cast之后,
elseif ( event == "UNIT_SPELLCAST_CHANNEL_STOP" or event == "UNIT_SPELLCAST_STOP" )then
后的代码不执行,我想问问还有什么是用来判断cast 完毕的.
ps: 已经试过在事件中加入 event == "UNIT_SPELLCAST_INTERRUPTED" or event == "UNIT_SPELLCAST_SUCCEEDED" or event == "UNIT_SPELLCAST_FAILED", 但是并不起作用. 没有高手愿意回答吗?我刚刚又测试过了,自己的stop casting就能找到,但是别人作为target的时候cast完毕后,不能触发spell cast的事件,为啥呢? 是否先指定了COMBAT_LOG_UNFILTERED? 啊,这倒是没有,我只在判断aura的时候用COMBAT_LOG_UNFILTERED,作为arg2传入,难道可以用arg2=="SPELL_CAST_START" 来判断? 请您详细说明一下如何使用?太感谢了.
我想我已经明白您的意思了,但是我不明白的是
"UNIT_SPELLCAST_CHANNEL_START" 和
if event == "COMBAT_LOG_UNFILTERED" and arg2 == "SPELL_CAST_START" 的区别 任何对战斗记录事件的处理都要先指定UNFILTERED,否则会因为系统战斗记录过滤的缘故无法捕捉到对应事件
参考
[url]http://bbs.cwowaddon.com/thread-3648-1-3.html[/url] UNIT_SPELLCAST_STOP
UNIT_SPELLCAST_SUCCEEDED
UNIT_SPELLCAST_INTERRUPTED
UNIT_SPELLCAST_FAILED
UNIT_SPELLCAST_FAILED_QUIET
UNIT_SPELLCAST_CHANNEL_STOP
战斗日志能提供所有附近的人的施法状况. 呵呵,很高兴有高手指教,我按照您提供的思路继续下去,然后我遇到了更有意思的问题,
我详细说明一下,如下:
举例你的"target"动作:
如果你的"target"正在casting spell,你可以用
event == "UNIT_SPELLCAST_CHANNEL_START" or event == "UNIT_SPELLCAST_START"
捕捉到起始事件,然后调用
event == "UNIT_SPELLCAST_CHANNEL_STOP" or event == "UNIT_SPELLCAST_STOP"
捕捉到结束事件
但是如果应用
if (event == "COMBAT_LOG_UNFILTERED") then
if (event == "UNIT_SPELLCAST_CHANNEL_START" or event == "UNIT_SPELLCAST_START")
...
end
end
这种格式是行不通的,只能利用arg2的参数传入 event 的类型,如下
if (event == "COMBAT_LOG_UNFILTERED" and arg2 == "SPELL_ CAST_START") then
...
end
其中包括 SPELL_ CAST_START, _CAST_SUCCESS,...
但是并不包括类似于"UNIT_SPELLCAST_STOP"的判断,请问如何解决?我参考了一下quartz,ecastingbar等castingbar的工具,他们都只是调用了event == "UNIT_SPELLCAST_CHANNEL_STOP"等独立事件,而不是调用event == "COMBAT_LOG_UNFILTERED"然后根据第二个参数来判断施法的状态,具体的参数可以参考 [url]http://www.wowwiki.com/API_COMBAT_LOG_EVENT#Aura_Type[/url]
请高手指教 SPELL_CAST_FAILED
施法条插件不需要用到战斗日志系统 呵呵,我觉得笼统的说一下,什么什么不需要什么什么不是解决根本问题的答案,不过很谢谢您的回复,我觉得我已经说明白我的问题了,如果表达方面有问题的话,请指正,然后我修改一下,但是真的是来求答案的,之前的帖子[url]http://bbs.cwowaddon.com/thread-4571-1-1.html[/url] 我就得到了很好的答案,我想这里应该是高手很多的. 战斗日志系统,能够比较实时的反映。不过可能那里的code让你误会了,我写完整点。
[quote]
<Frame name="Foo_Frame">
<Scripts>
<OnLoad>
Foo_OnLoad();
</OnLoad>
<OnEvent>
Foo_OnEvent();
</OnEvent>
</Scripts>
</Frame>
Function Foo_OnLoad()
this:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");
end
Function Foo_OnEvent([color=red]self, event, ...[/color])
--红字部分的参数,之所以他们不写,是因为这些值保存在公共变量里面,不写也可以调用。
if (event=="COMBAT_LOG_EVENT_UNFILTERED")
if (arg2=="SPELL_DAMAGE") then
if (Arg10=="Mind Blast" and arg17==true) then -- ==true for clarity only. Not needed.
DEFAULT_CHAT_FRAME:AddMessage("Mind Blast Just Critted!");
end
end
end
end
[/quote]
...是可变的参数,就是用arg1,arg2....这些去一一对应。这里,arg1对应timestamp,不用考虑。arg2对应event,就是要判断的值。当然arg9,arg10分别对应spellid,spellName,也可以利用下。
要注意一点,当红字的参数不写的时候,函数里面调用的event,arg1,arg2之类都是指公共变量。这样思考起来简单些。
另外一点,这里需要使用到的event应该是三个。
SPELL_CAST_START 开始施放。
SPELL_CAST_SUCCESS , SPELL_CAST_FAILED 施法结束。
UNIT_SPELLCAST_CHANNEL_START这样的事件不属于战斗日志系统,你写了也是没用的。另外战斗系统使用GUID代表一个人物,所以,还需要做些分析来判断是目标还是谁在施法。Arg3,arg4分别是施法者的GUID和Name,最好是使用GUID判断,不过想简单的话,用Name也可以了。这些分析我只看了那个文档,所以没自己测试过,因为一直在忙库的事情,精力不足,你多测试看看吧。 偶是说施法条插件(quartz/ecb)是不需要用战斗日志系统的....所以那些插件里面没有用到你问的这些.
这是sf翻译的详解, 和你看的那个一样....
[url=http://files.silverfox.name/html/combat_log_event_details.html]http://files.silverfox.name/html/combat_log_event_details.html[/url]
最好看几个插件.....比如WitchHunt, castyeller这些
UnitGUID() 这个api可以获取guid.比如 UnitGUID("player")
可以设置很复杂的过滤条件. 呵呵,谢谢各位了,感觉可能还是我的问题问的不清楚,该试的我都是了,事件是有时候可以捕捉到,有时候不行,而且判断施法完毕是个比较复杂的事情,我基本翻阅了wikki上所有关于cast 和combat的东西,感觉那些castingbar的addon是用timer来控制bar的结束,而不是真正意义上的判断结束来中指显示.如果各位觉得我现在的问题是停留在不知道如何判断event和控制参数上,那其实不是真正的问题,而且对于events和arg的调用很清楚,具体说一下我的工作吧,测试如下
在我成功利用event取得当前target 施法完毕后,我用测试打印惊奇的发现,UnitChannelInfo(unit) or UnitCastingInfo(unit) 仍然不是nil,这个发生的几率很小,但是有时候会发生,我感觉是和上次blzd改过GCD后向服务器提交cast details的事情有关,前台虽然判断施法结束,但是实际上服务器仍然认定,当前施法者仍然在cast(时间可能<1/10秒),当然,这只是我的猜想,也有可能是我的逻辑错误,我现在其实不是想知道具体怎样去操作了,只是想知道如果你来做一个类似功能插件的思路.功能很简单,如下
如果target施法,提示,施法完毕,提示,当然要包括cast 和channel。这里我可以给个提醒,如果你是channel法术的话,这里有个细节,channel 的过程是 UNIT_SPELLCAST_CHANNEL_START ->UNIT_SPELLCAST_STOP->UNIT_SPELLCAST_CHANNEL_STOP 是2次stop.
不管怎么说,谢谢回帖,我会仔细阅读每位的回帖的,再次感谢! 最近也在研究这个问题,因为我监视的对象不局限于目标,焦点这些对象,所以从战斗日志方面着手,目前想到2个方案:
1.监视SPELL_CAST_START事件,用GetSpellInfo(spellID)获得施法时间,起始时间+施法时间就是完成时间了,如果被打断这次施法就算失败.
2.也是监视SPELL_CAST_START,追踪这个技能的后续事件,如果造成伤害或是造成效果影响,那么造成伤害或效果的时间就是施法完成的时间.
当然这只是简单的介绍,里面还涉及很多细节,希望有兴趣的可以一起研究.
页:
[1]