找回密码
 点一下
查看: 2055|回复: 9

效果(Effect)事件中应该注意的一点,关于效果治疗量的获取

[复制链接]
发表于 2010-9-23 14:13:42 | 显示全部楼层 |阅读模式
由于Create Healer本身是一个持续性的效果。也就是在一段时间内治疗多少 HP。属于那种线性的生命恢复效果。


而效果事件本身是在效果刚刚发动后引发的。所以在事件发生时,我们用EventPlayerEffectUsedAmountFixed()其实获得的是治疗效果第一跳时候的治疗量。


这么一说,获取治疗量岂不是变得没意义了?并非如此,我在这问题上也困惑了好久,不过最终还是整出来了。


[trigger]

Simple Debug Healing Amount
    Events
        Environment - Effect Used(1, Medivac - Heal (Create Healer))
    Local Variables
    Conditions
    Actions
        Debug - Display (Text((Triggering Effect Amount (Real)(Healed, false))) with Any Precision decimal places) as debug output using Type 1, and Do display it in the game window
        General - Wait 0.2 Game Time seconds
        Debug - Display (Text((Triggering Effect Amount (Real)(Healed, false))) with Any Precision decimal places) as debug output using Type 1, and Do display it in the game window
        General - Wait 0.2 Game Time seconds
        Debug - Display (Text((Triggering Effect Amount (Real)(Healed, false))) with Any Precision decimal places) as debug output using Type 1, and Do display it in the game window
        General - Wait 0.2 Game Time seconds
        Debug - Display (Text((Triggering Effect Amount (Real)(Healed, false))) with Any Precision decimal places) as debug output using Type 1, and Do display it in the game window
[/trigger]


在这个触发里我试着每0.2秒输出一次医疗船医疗效果的治疗量。

结果在debug窗体中显示的是:


00:00:13.44 1.13574
00:00:13.44 Running gt_Debug_Func (Event: TriggerDebug/EventPlayerEffectUsed)
00:00:13.69 2.83936
00:00:13.94 5.11084
00:00:14.19 7.38232


这些数据正好对应该治疗效果在对应时间里的治疗总量。真是意外的惊喜。原来对于持续性效果,我们还能获得它从第一次执行开始到当前时间里的治疗量。并非只能获得其触发瞬间的治疗量。这点和war3的触发响应思路似乎有很大的不同。因为在war3当中,触发单位之类的东西在线程中应该是保持不变的。


不过仔细思考的话,应该可以认为是Galaxy隐藏了Triggering Effect这个函数,不让用户直接获得触发效果的handle,而是给出一整套函数直接让用户获得触发效果的治疗量,施法者,模板ID,目标,源点等等数据。这样,在函数线程中,触发效果依然是保持不变的,但是该触发效果的治疗量却会随时间变化,就像触发单位的HP是会变的一样。




最后一点要提的是,我目前未能找到获得触发效果伤害量\吸收量\闪避量的方法。无论我怎么弄返回的都是0。怀疑这三样可能还未正式引入Galaxy中。好在我们现在可以通过伤害事件来获得伤害量,虽然和效果事件的原理和应用范围都不一样。不过也有可能是我的代码写的有问题。

有哪位同学能正常获得伤害量\吸收量\闪避量的话请发个帖子来说明下,有威望奖励哦
发表于 2010-9-23 14:28:23 | 显示全部楼层
头目伟大  头目英明  头目千秋万代一统江湖
回复

使用道具 举报

发表于 2010-9-24 00:50:16 | 显示全部楼层
看完了~~~

头目v5!!!
回复

使用道具 举报

 楼主| 发表于 2010-9-25 20:53:01 | 显示全部楼层
我搞清楚伤害量这些东西了。

原来同一个玩家之间互相打就无法获取伤害量。好在我们还有单位伤害事件。

而只要打敌人就能获得伤害量。


伤害量的第二个参数是用来决定是否计算总伤害量的。由于存在一些伤害效果是AOE伤害,所以如果第二个参数为false的话就只计算主目标身上的伤害/溅射,而如果为true就是单次AOE所波及到目标上的伤害全部加起来算。
回复

使用道具 举报

发表于 2010-9-26 12:51:16 | 显示全部楼层
触发器似乎无法判断“属于某一个效果的子类”,而Actor可以
回复

使用道具 举报

 楼主| 发表于 2010-9-26 15:13:44 | 显示全部楼层
不知道你在说什么。

如果你说的是一个效果引发的子效果的话。这里的total并不是指一个效果引发的字效果的伤害总和,但是Damage Effect本身就可以不止伤害一个目标。比如在这个版本里,雷兽的凯撒之刃就从之前版本的Search Area+Damage 变成了一个单一的Damage效果,直接对一个区域造成伤害。

这里的total为true就是返回一次aoe的总伤害了。false就是返回主目标的伤害。
回复

使用道具 举报

发表于 2010-9-26 15:33:43 | 显示全部楼层
total看懂了,我说的是别的

FromEffectTreeDescendant,Actor里面有这个判断,字面理解就有个子类

于是我在想,触发器之前说的那个遍历XML的功能是不是能够判断,
回复

使用道具 举报

发表于 2010-9-26 15:43:36 | 显示全部楼层
EffectParent是判断父类的
这个FromEffectTreeDescendant的理解,是不是指的整个效果链的最末端呢...

----
看起来和字面意思有天壤之别...
回复

使用道具 举报

发表于 2010-9-26 16:16:13 | 显示全部楼层
呜,这个EffectExecuteIndex也是个怪东西...难道是队列...

-----------------------------------------------------------------------
哈,真的是队列,一个效果链里某个效果第几次发动(Set 这种无法捕捉,Damage或是修改单位可以捕捉),发动次数指定同一个效果,不同效果的次数不会互相干扰


总而言之,Actor的事件捕捉比触发器高级太多了...


暴雪别的不谈,只要给触发器加上个捕捉Actor的创造事件,就可以解决多少个那啥问题...
回复

使用道具 举报

 楼主| 发表于 2010-9-26 17:43:06 | 显示全部楼层
那是不行的。

Native.galaxy里有明确解释为什么不能这么做。

所有有关Actor的东西都是不确定的,是会根据本地电脑的配置和游戏设置而变化的。一个Actor在玩家1的电脑上能创建,到了玩家2的电脑可能就创建不了。如果给它们制作事件必然就会造成异步触发。

虽然SC2本质上支持异步触发,但是并不会公开此功能,因为会一不小心就会导致玩家掉线。

另外,本地函数里所有有关Actor的函数都会力图不返回任何可能导致异步的值。如果真要返回一个Actor,可能结果会返回出个null。可是不管这个Actor是否真的创建成功。而且你依然可以对这个返回值进行进一步操作而不会因为操作一个不存在的actor而导致游戏crash。就算是null,也会被当作合法值来内部处理掉,总之所有需要actor作为参数的函数都会假装自己得到的参数永远都是合法值。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-23 13:21 , Processed in 0.066288 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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