疯人¢衰人 发表于 2009-8-22 15:51:30

被动技能的制作教程

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

               这个是个简单的被动技能,就是单位进行攻击时有一定概率击晕面前一定范围的单位。
               前面都是主动技能,这里给大家做一个被动技能的演示。这个被动技能是模拟的,并没有主动技能,如果你要一个类似的英雄技能,你可以做一个没有施放效果的被动技能,通过这个技能的等级来影响数据。这里我就不添加主动技能了。
               要范围眩晕,可以使用的从属技能有几个,例如,穿刺、战争践踏……我这里使用的是穿刺。
               技能的T为:

未命名触发器 001
      事件
               单位 - 任意单位 被攻击
      条件
               (攻击单位) 等于 danwei
               (随机实数,最小值: 0.00 最大值: 100.00) 大于或等于 50.00
       动作
                   设置 dian = (danwei 的位置)
                   单位 - 创建 1 个 弓箭手 给 玩家1(红色) 在 dian ,面向角度为 (danwei 的面向角度) 度
                   单位 - 立即移动 (最后创建的单位) 到 dian
                   设置 dian = (从 dian 开始,距离 300.00 ,方向为 (danwei 的面向角度) 度的位移处)
                   单位 - 对 (最后创建的单位) 发布 不死族地穴领主 - 穿刺 命令到目标点: dian
                  单位 - 设置 1.00 秒 普通 类型的生命周期对 (最后创建的单位)


未命名触发器 002
   事件
                   单位 - 任意单位 死亡
    条件
                   ((死亡单位) 的类型) 等于 弓箭手
    动作
                  单位 - 删除 (死亡单位)

               这个也不用什么解释了,攻击——判断并计算概率——发动技能。很简单。

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

               不可否认,这种方法很简单,不过它有个致命弱点,那就是S流。
         所谓S流,就是攻击然后狂按S键。目的是为了使如上方法制作的被动技能的技能效果多次发动。会有这个问题的原因是单位 - 任意单位 被攻击这个事件的响应时在攻击单位真正的攻击前,也就是在攻击前摇没有结束前就响应了事件。当技能效果发动后,玩家还可以通过发布停止命令来打断单位的普通攻击。于是技能效果就不断的叠加。
         解决的方法是用单位接受伤害事件:单位 - (XXX) 接受伤害)。不过这个事件也不是那么完美。关于这个我们先不去研究,我们先看一个技能。

startreg
    事件
      时间 - 当游戏逝去 0.00 秒
    条件
    动作
      循环动作从 1 到 12, do (玩家 - 禁用 魔法书对 (玩家 I))
      单位组 - 选取 ((可用地图区域) 内的所有单位) 内所有单位 (触发器 - 为 attacked <预设> 添加事件: (单位 - (选取单位) 接受伤害))


reg
    事件
      单位 - 任意单位进入 (可用地图区域)
    条件
    ((进入的单位) 的类型) 不等于 计时马甲
    动作
      触发器 - 为 attacked <预设> 添加事件: (单位 - (进入的单位) 接受伤害)


skillonandoff
    事件
      单位 - 任意单位 发布无目标指令
    条件
      Or - 任意条件成立
            条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldon
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldoff
    动作
      如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldon
            Then - 动作
                单位 - 添加 魔法书给 (发布命令的单位)
            Else - 动作
      如果(所有的条件成立) 则运行 (Then - 动作) 否则运行 (Else - 运作)
            If - 条件
                (转换 (发布的命令ID) 为命令字符串) 等于 manashieldoff
            Then - 动作
                单位 - 删除 魔法书从 (发布命令的单位)
                单位 - 删除 近战抵抗护盾从 (发布命令的单位)
            Else - 动作


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 - 动作
                单位 - 删除 魔法书从 (伤害来源)
                单位 - 删除 近战抵抗护盾从 (伤害来源)


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

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


      关于主动技能的制作,请看:技能制作初级教程。
      关于注册事件,请看:T的进阶教程
页: [1]
查看完整版本: 被动技能的制作教程