找回密码
 点一下
查看: 12455|回复: 0

被动技能的制作教程

  [复制链接]
发表于 2009-8-22 15:51:30 | 显示全部楼层 |阅读模式
         被动技能,它的制作思路,与主动技能的制作思路是有一定不同的。这种不同主要在于对技能发动事件的响应,即所使用的事件不同。
        如果做的是一些类似发球效果的普攻附带技能 ,可以使用闪电之球(新的)这个技能来做,不过能够使用这种方法添加的技能有限,具体请自己尝试。另外球类几率技能一定要smart或attack命令才会触发,否则100%的概率也没用。所以如果无法发动效果,就用触发为单位发布命令吧。
             实际上大多时候,我们都是采用判断攻击的方法。下面的技能就是一个例子:

               这个是个简单的被动技能,就是单位进行攻击时有一定概率击晕面前一定范围的单位。
               前面都是主动技能,这里给大家做一个被动技能的演示。这个被动技能是模拟的,并没有主动技能,如果你要一个类似的英雄技能,你可以做一个没有施放效果的被动技能,通过这个技能的等级来影响数据。这里我就不添加主动技能了。
               要范围眩晕,可以使用的从属技能有几个,例如,穿刺、战争践踏……我这里使用的是穿刺。
               技能的T为:
[trigger]
未命名触发器 001
        事件
                 单位 - 任意单位 被攻击
        条件
                 (攻击单位) 等于 danwei
                 (随机实数,最小值: 0.00 最大值: 100.00) 大于或等于 50.00
       动作
                   设置 dian[1] = (danwei 的位置)
                   单位 - 创建 1 个 弓箭手 给 玩家1(红色) 在 dian[1] ,面向角度为 (danwei 的面向角度) 度
                   单位 - 立即移动 (最后创建的单位) 到 dian[1]
                   设置 dian[2] = (从 dian[1] 开始,距离 300.00 ,方向为 (danwei 的面向角度) 度的位移处)
                   单位 - 对 (最后创建的单位) 发布 不死族地穴领主 - 穿刺 命令到目标点: dian[2]
                  单位 - 设置 1.00 秒 普通 类型的生命周期对 (最后创建的单位)
[/trigger]
[trigger]
未命名触发器 002
     事件
                   单位 - 任意单位 死亡
    条件
                   ((死亡单位) 的类型) 等于 弓箭手
    动作
                    单位 - 删除 (死亡单位)
[/trigger]
                 这个也不用什么解释了,攻击——判断并计算概率——发动技能。很简单。

这是演示下载:被动范围击晕

               不可否认,这种方法很简单,不过它有个致命弱点,那就是S流。
         所谓S流,就是攻击然后狂按S键。目的是为了使如上方法制作的被动技能的技能效果多次发动。会有这个问题的原因是单位 - 任意单位 被攻击这个事件的响应时在攻击单位真正的攻击前,也就是在攻击前摇没有结束前就响应了事件。当技能效果发动后,玩家还可以通过发布停止命令来打断单位的普通攻击。于是技能效果就不断的叠加。
         解决的方法是用单位接受伤害事件:单位 - (XXX) 接受伤害)。不过这个事件也不是那么完美。关于这个我们先不去研究,我们先看一个技能。
[trigger]
startreg
    事件
        时间 - 当游戏逝去 0.00 秒
    条件
    动作
        循环动作[I]从 1 到 12, do (玩家 - 禁用 魔法书  对 (玩家 I))
        单位组 - 选取 ((可用地图区域) 内的所有单位) 内所有单位 (触发器 - 为 attacked <预设> 添加事件: (单位 - (选取单位) 接受伤害))
[/trigger]
[trigger]
reg
    事件
        单位 - 任意单位进入 (可用地图区域)
    条件
    ((进入的单位) 的类型) 不等于 计时马甲
    动作
        触发器 - 为 attacked <预设> 添加事件: (单位 - (进入的单位) 接受伤害)
[/trigger]
[trigger]
skillonandoff
    事件
        单位 - 任意单位 发布无目标指令
    条件
        Or - 任意条件成立
            条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldon
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldoff
    动作
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldon
            Then - 动作
                单位 - 添加 魔法书  给 (发布命令的单位)
            Else - 动作
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldoff
            Then - 动作
                单位 - 删除 魔法书  从 (发布命令的单位)
                单位 - 删除 近战抵抗护盾  从 (发布命令的单位)
            Else - 动作
[/trigger]
[trigger]
attacked
    事件
    条件
        (单位所受伤害) 等于 1.00
        (随机实数,最小值: 0.00 最大值: 100.00) 小于或等于 (20.00 x (转换 (近战抵抗护盾  的等级对 (伤害来源)) 为实数))
    动作
        单位 - 设置 (触发单位) 的生命值为 ((生命值 对于 (触发单位)) + 1.00)
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                ((伤害来源) 拥有 近战抵抗护盾 ) 等于 TRUE
            Then - 动作
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        (魔法值 对于 (伤害来源)) 大于或等于 Needmana
                    Then - 动作
                        Set UnitA[(((当前触发) 的触发动作运行次数) mod 8000)] = (伤害来源)
                        Set UnitB[(((当前触发) 的触发动作运行次数) mod 8000)] = (触发单位)
                        Set Point_A = ((伤害来源) 的位置)
                        Set Point_B = ((触发单位) 的位置)
                        Set Point_C = (从 Point_A 开始,距离 50.00 ,方向为 (Point_A 到 Point_B 的角度) 度的位移处)
                        单位 - 设置 (伤害来源) 的魔法值为 ((魔法值 对于 (伤害来源)) - Needmana)
                        如果 ((魔法值 对于 (伤害来源)) 小于 Needmana) 成立,则运行 (单位 - 对 (伤害来源) 发布 中立 娜迦海巫 - 关闭魔法盾 命令) 否则运行 (不做任何动作)
                        单位 - 创建 1 个 计时马甲 给 ((伤害来源) 的所有者) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
                        单位 - 设置 (最后创建的单位) 的自定义值为 (((当前触发) 的触发动作运行次数) mod 8000)
                        单位 - 设置 (最后创建的单位) 的魔法值为 (Movelength / Movespeed)
                        单位 - 设置 Movetime 秒 普通 类型的生命周期对 (最后创建的单位)
                        触发器 - 为 timer <预设> 添加事件: (单位 - (最后创建的单位) 死亡)
                        单位 - 创建 1 个 特效马甲 给 ((伤害来源) 的所有者) 在 Point_C ,面向角度为 (Point_A 到 Point_B 的角度) 度
                        单位 - 设置 0.30 秒 普通 类型的生命周期对 (最后创建的单位)
                        点 - 清除 Point_A
                        点 - 清除 Point_B
                        点 - 清除 Point_C
                    Else - 动作
                        单位 - 对 (伤害来源) 发布 中立 娜迦海巫 - 关闭魔法盾 命令
            Else - 动作
                单位 - 删除 魔法书  从 (伤害来源)
                单位 - 删除 近战抵抗护盾  从 (伤害来源)
[/trigger]
[trigger]
timer
    事件
    条件
        ((死亡单位) 的类型) 等于 计时马甲
    动作
        Set PointA = (UnitA[((死亡单位) 的自定义值)] 的位置)
        Set PointB = (UnitB[((死亡单位) 的自定义值)] 的位置)
        Set PointC = (从 PointB 开始,距离 Movespeed ,方向为 (PointA 到 PointB 的角度) 度的位移处)
        如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (PointA 和 PointC 之间的距离) 小于或等于 Movelength
                (PointC 处的 可通行地面 通行状态为关闭) 不等于 TRUE
                (魔法值 对于 (死亡单位)) 大于或等于 1.00
            Then - 动作
                单位 - 设置 UnitB[((死亡单位) 的自定义值)] 的X坐标为 (PointC 的X轴坐标)
                单位 - 设置 UnitB[((死亡单位) 的自定义值)] 的Y坐标为 (PointC 的Y轴坐标)
                如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
                    If - 条件
                        ((PointA 和 PointC 之间的距离) + Movespeed) 小于或等于 Movelength
                    Then - 动作
                        单位 - 创建 1 个 计时马甲 给 ((死亡单位) 的所有者) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
                        单位 - 设置 (最后创建的单位) 的自定义值为 ((死亡单位) 的自定义值)
                        单位 - 设置 (最后创建的单位) 的魔法值为 ((魔法值 对于 (死亡单位)) - 1.00)
                        单位 - 设置 Movetime 秒 普通 类型的生命周期对 (最后创建的单位)
                        触发器 - 为 timer <预设> 添加事件: (单位 - (最后创建的单位) 死亡)
                    Else - 动作
            Else - 动作
        点 - 清除 PointA
        点 - 清除 PointB
        点 - 清除 PointC

[/trigger]
这是演示:近战抵抗护盾
                  
           这是个比较复杂的技能,你可以打开这个帖子来看详细的说明:T的局域化与变量传递研究演示技能——近战抵抗护盾 。现在我们不是要研究整个技能,我们只要注意startreg,reg,attacked这三个触发就行。其中startreg,reg两个触发的存在意义就为attacked注册事件。我们使用这样的方法正是因为接受伤害事件的第一个问题——正常使用时只能选择初始放置在地图上的单位。
       另外的一个问题是:这个事件所判断的是伤害,我们无法用它区分开技能伤害还是普通伤害,然而我们的技能要求是普通攻击附带,而释放技能时不会产生效果。因此,我们不得不用条件来做区分。
       可以区分的有如下几个方面:1、伤害值。技能伤害是特定的值(有益技能的伤害是0),我们可以通过设置英雄的普通伤害是某个特别的值来区别,具体可以使用-1被的致命一击或者其他方法(例如上面的近战抵抗护盾,就是判断反弹伤害的值)。2、魔法效果。大多时候,我们都是使用这个方法,只要判断攻击目标身上是否有特定BUFF就行。不过因为有法球冲突,这样的判断还是有问题的。3,结合者两条。基本上这种方法都是用-1倍带魔法效果的致命一击+0伤害值判断。然而因为带有魔法效果的致命一击会打断目标施法(这个BUFF的效果基本上与重击一样)。
           
       关于被动技能所要说的就这么多。其他的方面参考普通主动技能的制作即可,如果想添加上概率的话,在被注册的触发加上一个判断随机数是否大于某个数的条件即可。


        关于主动技能的制作,请看:技能制作初级教程
        关于注册事件,请看:T的进阶教程

评分

参与人数 1威望 +13 收起 理由
alexries + 13 当然如果不想要111数字可以帮你去掉口粉

查看全部评分

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

本版积分规则

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

GMT+8, 2024-4-23 17:45 , Processed in 0.139825 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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