找回密码
 点一下
查看: 8872|回复: 2

伤害捕捉与伤害系统

  [复制链接]
发表于 2011-3-19 21:10:55 | 显示全部楼层 |阅读模式
随着WE技术的发展和魔兽地图的复杂化,我们越来越多的需要用到”单位接受伤害”事件来完成需要的效果。
比如:伤害显示系统、属性伤害技能、伤害减少(增加、反弹)技能、物理攻击被动技能…………

但是,官方WE中里面是没有“任意单位接受伤害”事件的,因此为了让触发会在任意单位接受伤害的时候都被触发,我们需要使用“动态注册”的方法——也就是在游戏运行的过程中动态为触发注册事件。

[trigger]Init
    事件
        地图初始化
    条件
    动作
        单位组 - 选取 ((完整地图区域) 内的所有单位) 内所有单位做动作
            Loop - 动作
                触发器 - 为 Damage<预设> 添加事件: (单位 - (选取单位) 接受伤害)
[/trigger]
[trigger]Enter
    事件
        单位 - 单位进入 (完整地图区域)
    条件
    动作
        触发器 - 为 Damage<预设> 添加事件: (单位 - (触发单位) 接受伤害)
[/trigger]
[trigger]Damage
    事件
    条件
    动作
        漂浮文字 - 创建漂浮文字:(转换 (转换 (单位所受伤害) 为整数) 为字符串) 在 (触发单位) 头顶Z轴偏移 0.00 处,字体大小: 10.00 ,颜色值:(100.00%, 100.00%, 100.00%) ,透明度: 0.00%
        漂浮文字 - 设置 (最后创建的漂浮文字) 的移动速率为 90.00 ,方向为 90.00 度
        漂浮文字 - 设置 (最后创建的漂浮文字) 的生命周期为 2.00 秒
        漂浮文字 - 设置 (最后创建的漂浮文字) 的消逝时间点为 1.00 秒
        漂浮文字 - 设置 (最后创建的漂浮文字) : 禁用 永久显示.
[/trigger] 伤害显示.w3x (11 KB, 下载次数: 377)
比如在上面的这个“伤害显示系统”的触发中,我先使用了“Init”和“Enter”为“Damage”注册了伤害事件,然后在“Damage”触发中用漂浮文字显示伤害值。

“Init”和“Enter”就是动态为“Damage”注册伤害事件的触发

而如果想要知道伤害是否来源于英雄的技能,从而制作属性伤害技能。
只需要加入一个条件判断,判断单位是否拥有该技能的Buff就可以了。
同时,为了避免重复伤害,我们可以在判断成功后删除该Buff。

[trigger]Damage
    事件
    条件
        ((触发单位) 拥有 暴风雪 (施法者)) 等于 TRUE
    动作
        单位 - 删除 暴风雪 (施法者) 从 (触发单位)
        单位 - 命令 (伤害来源) 对 (触发单位) 造成 (转换 ((智力 对 (伤害来源) (包括 加成)) x (暴风雪 的等级对 (伤害来源))) 为实数) 点伤害,攻击类型: 法术 伤害类型: 冰冻
[/trigger] 属性伤害.w3x (11 KB, 下载次数: 268)
比如上面的触发就可以实现属性伤害暴风雪。

同理,要使物理攻击带有特殊效果也可以使用使用上面的触发来完成。
你只需要为英雄添加一个攻击带有Buff的法球技能(或者“重击”),然后在“接受伤害”时检查Buff就可以了。

但是,这样会占用法球的位置(使用“重击”会打断单位动作),确实不是很方便。
为了解决这个问题,大家想了很多办法,但是都不是很完美。
这里推荐一下其中两个比较完美的方法:全法球系统 和 魔法护盾法
全法球系统
将地图上所有的单位都添加一个法球技能(方法等同“动态注册”),然后通过“接受伤害”的时候检查BUFF来判断伤害是否来源于物理攻击。
如果伤害时来源于物理攻击的,那么触发检查单位身上的物品和技能,并模拟法球和发动被动技能。
(全法球系统,可以理解为:全部法球都需要模拟的系统……这是它唯一的缺陷了)
魔法护盾法
将需要检查接受伤害的单位身上套一个“护盾生命”为-1的“魔法护盾(女妖的技能)”,如果单位“接受伤害”时身上的盾破了(没有“魔法护盾”的BUFF),那么一般来说单位受到的就是魔法伤害了。(反之则是物理伤害)
这个方法的缺点在于“误差大”和“效率较低”。
但是对于单个单位的判断来说比较方便,比如用来制作DOTA中斧王的“反转螺旋”就是个不错的选择。

而如果想要制作一个可以减少(增加,反弹)伤害的被动技能,也是同理:只要将检查Buff的触发修改为检查技能就可以了。
[trigger]Damage
    事件
    条件
        (专注光环 的等级对 (触发单位)) 大于 0
    动作
        触发器 - 关闭 (当前触发)
        -------- 伤害增加75%如下 --------
        单位 - 命令 (伤害来源) 对 (触发单位) 造成 ((单位所受伤害) x 0.75) 点伤害,攻击类型: 混乱 伤害类型: 神圣
        -------- 伤害反弹50%如下 --------
        单位 - 命令 (触发单位) 对 (伤害来源) 造成 ((单位所受伤害) x 1.00) 点伤害,攻击类型: 混乱 伤害类型: 神圣
        触发器 - 开启 (当前触发)
[/trigger] 伤害反弹.w3x (12 KB, 下载次数: 205)
当然,在“接受伤害”事件里面,“伤害值”就是单位减少的生命值,而伤害值是无法通过触发直接修改的。
因此,为了实现“增加伤害”(或者“法术暴击”)的效果,我们需要再对单位造成一次伤害(反弹伤害也是同理,只是对象不一样了而已)。

需要说明的是:
想要在有“接受伤害”事件的触发里面使用“命令单位造成伤害”的触发,就必须要想办法来避免重复触发所引起的死循环,因此需要使用“关闭当前触发”“开启当前触发”的组合来实现这个目标。
另外,由于“接受伤害”事件是发生在单位生命值减少之前的,所以如果A杀死B的同时被B反弹致死,那么死亡的顺序是:A先死,B后死。

[trigger]Damage
    事件
    条件
        (专注光环 的等级对 (触发单位)) 大于 0
动作
        -------- 伤害减少100%如下 --------
        单位 - 设置 (触发单位) 的生命值为 ((生命值 对于 (触发单位)) + ((单位所受伤害) x 1.00))
[/trigger]
要知道在“接受伤害”事件里面,“伤害值”就是单位减少的生命值,所以在“接受伤害”的时候增加单位的生命值就可以实现伤害减免。

需要注意的是,运行上面的触发会有以下几个情况:

①如果英雄受到了足以致死的伤害(生命值 < 伤害值 < 最大生命值),那么单位并不会死亡,实际上它可能连减血也不会,因为“接受伤害”事件是发生在“生命减少”和“判断死亡”之前的。

②因为“接受伤害”发生在扣血之前,而单位的生命值是无法超过生命上限的,所以如果通过“增加生命”的方法来实现伤害减少,就会导致单位在(伤害值 > 单位损失的生命值)的时候无法抵挡全部伤害(只能抵挡等同于单位损失生命值的伤害)。
也就是说,如果“山丘之王”满血,那么它受到的伤害是无法抵挡的。

③如果(“伤害值” > “最大生命值”),那么你会听见pia的一声,然后该单位就挂了……要知道“单位的生命值是无法超过生命上限的”……

为了解决这些问题,我们可以:
在单位接受伤害时为其添加一个“生命最大值增加99999”的技能,然后触发设置其生命值,最后开启零秒计时器删除该技能,比如:
[trigger]Damage
    事件
    条件
    动作
        设置 Real = ((生命值 对于 (触发单位)) + (单位所受伤害))
        单位 - 添加 生命增加 (9999) 给 (触发单位)
        单位 - 设置 (触发单位) 的生命值为 Real
        单位组 - 添加 (触发单位) 到 Group
        触发器 - 开启 Timer <预设>
[/trigger] [trigger]Timer
    事件
        时间 - 每 0.00 秒触发事件
    条件
    动作
        触发器 - 关闭 (当前触发)
        单位组 - 选取 Group 内所有单位做动作
            Loop - 动作
                设置 Real = (生命值 对于 (选取单位))
                单位 - 删除 生命增加 (9999) 从 (选取单位)
                单位 - 设置 (选取单位) 的生命值为 Real
                单位组 - 把 (选取单位) 从 Group 移除
[/trigger] 伤害抵消.w3x (12 KB, 下载次数: 217)

另外,动态注册也不一定就需要将所有单位都注册到触发当中,只需要将需要检查的单位注册一遍就可以了。
[trigger]Q
    事件
        单位 - 任意单位 发动技能效果
    条件
        (施放技能) 等于 风暴之锤
        ((技能施放目标) 在 Group 中) 等于 FALSE
    动作
        触发器 - 为 W <预设> 添加事件: (单位 - (技能施放目标) 接受伤害)
        单位组 - 添加 (技能施放目标) 到 Group
[/trigger] [trigger]W
    事件
    条件
        ((触发单位) 拥有 击晕) 等于 TRUE
    动作
        单位 - 删除 击晕 从 (触发单位)
        单位 - 命令 (伤害来源) 对 (触发单位) 造成 (转换 (力量 对 (伤害来源) (不包括 加成)) 为实数) 点伤害,攻击类型: 法术 伤害类型: 普通
[/trigger]
比如这个“属性伤害风暴之锤”就是在扔锤子的时候注册一遍而已。
(判断单位是否在Group内是为了防止重复注册)

注意:最好将所有的“接受伤害”事件写到一个触发里,不要为每一个需要“接受伤害”的技能都建立一个触发,不然绝对会很卡的……

评分

参与人数 1威望 +9 收起 理由
alexries + 9 v5

查看全部评分

发表于 2011-3-20 17:43:53 | 显示全部楼层
不错不错,另外。。。。。。
一开始那个单位组疑似没有排泄
And......那个魔法护盾的“误差”指的是啥
回复

使用道具 举报

 楼主| 发表于 2011-3-20 18:40:25 | 显示全部楼层
排泄……
既然只有一个单位组,那我们就无视它吧……

魔法护盾的误差是指:
魔法护盾在受到任意“魔法伤害”的时候都会破盾。
比如:
如果单位是魔法攻击(如:女巫),那么它的普通攻击也可以破盾
如果单位攻击带毒,那么盾会来来回回破很多次……

另外:教学资料区禁止回复!(如果有问题要问,可以到疑问区单独开个帖子,纯顶就不要了)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 16:50 , Processed in 0.075786 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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