CWDG论坛-专业魔兽插件's Archiver

wannaddon 发表于 2008-8-15 14:22

如何判断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", 但是并不起作用.

wannaddon 发表于 2008-8-15 15:56

没有高手愿意回答吗?我刚刚又测试过了,自己的stop casting就能找到,但是别人作为target的时候cast完毕后,不能触发spell cast的事件,为啥呢?

digmouse 发表于 2008-8-15 19:23

是否先指定了COMBAT_LOG_UNFILTERED?

wannaddon 发表于 2008-8-16 01:27

啊,这倒是没有,我只在判断aura的时候用COMBAT_LOG_UNFILTERED,作为arg2传入,难道可以用arg2=="SPELL_CAST_START" 来判断? 请您详细说明一下如何使用?太感谢了.

我想我已经明白您的意思了,但是我不明白的是
"UNIT_SPELLCAST_CHANNEL_START" 和
if event == "COMBAT_LOG_UNFILTERED" and arg2 == "SPELL_CAST_START" 的区别

digmouse 发表于 2008-8-16 12:50

任何对战斗记录事件的处理都要先指定UNFILTERED,否则会因为系统战斗记录过滤的缘故无法捕捉到对应事件
参考
[url]http://bbs.cwowaddon.com/thread-3648-1-3.html[/url]

yleaf 发表于 2008-8-16 14:29

UNIT_SPELLCAST_STOP
UNIT_SPELLCAST_SUCCEEDED
UNIT_SPELLCAST_INTERRUPTED
UNIT_SPELLCAST_FAILED
UNIT_SPELLCAST_FAILED_QUIET
UNIT_SPELLCAST_CHANNEL_STOP
战斗日志能提供所有附近的人的施法状况.

wannaddon 发表于 2008-8-16 16:12

呵呵,很高兴有高手指教,我按照您提供的思路继续下去,然后我遇到了更有意思的问题,
我详细说明一下,如下:

举例你的"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]

请高手指教

yleaf 发表于 2008-8-16 17:46

SPELL_CAST_FAILED

施法条插件不需要用到战斗日志系统

wannaddon 发表于 2008-8-16 18:17

呵呵,我觉得笼统的说一下,什么什么不需要什么什么不是解决根本问题的答案,不过很谢谢您的回复,我觉得我已经说明白我的问题了,如果表达方面有问题的话,请指正,然后我修改一下,但是真的是来求答案的,之前的帖子[url]http://bbs.cwowaddon.com/thread-4571-1-1.html[/url] 我就得到了很好的答案,我想这里应该是高手很多的.

kurapica 发表于 2008-8-16 20:39

战斗日志系统,能够比较实时的反映。不过可能那里的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也可以了。这些分析我只看了那个文档,所以没自己测试过,因为一直在忙库的事情,精力不足,你多测试看看吧。

yleaf 发表于 2008-8-16 21:46

偶是说施法条插件(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")
可以设置很复杂的过滤条件.

wannaddon 发表于 2008-8-16 23:28

呵呵,谢谢各位了,感觉可能还是我的问题问的不清楚,该试的我都是了,事件是有时候可以捕捉到,有时候不行,而且判断施法完毕是个比较复杂的事情,我基本翻阅了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.

不管怎么说,谢谢回帖,我会仔细阅读每位的回帖的,再次感谢!

mysdia 发表于 2008-8-26 17:40

最近也在研究这个问题,因为我监视的对象不局限于目标,焦点这些对象,所以从战斗日志方面着手,目前想到2个方案:
1.监视SPELL_CAST_START事件,用GetSpellInfo(spellID)获得施法时间,起始时间+施法时间就是完成时间了,如果被打断这次施法就算失败.
2.也是监视SPELL_CAST_START,追踪这个技能的后续事件,如果造成伤害或是造成效果影响,那么造成伤害或效果的时间就是施法完成的时间.
当然这只是简单的介绍,里面还涉及很多细节,希望有兴趣的可以一起研究.

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.