偶久网

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索

网站魔兽热门地图

查看: 36142|回复: 179

被动技能的制作

  [复制链接]
ou99孽缘 title=
发表于 2010-12-14 18:19:50
本帖最后由 ou99孽缘 于 2010-12-14 18:22 编辑 被动技能,它的制作思路,与主动技能的制作思路是有一定不同的。这种不同主要在于对技能发动事件的响应,即所使用的事件不同。
        如果做的是一些类似发球效果的普攻附带技能 ,可以使用闪电之球(新的)这个技能来做,不过能够使用这种方法添加的技能有限,具体请自己尝试。另外球类几率技能一定要smart或attack命令才会触发,否则100%的概率也没用。所以如果无法发动效果,就用触发为单位发布命令吧。

             实际上大多时候,我们都是采用判断攻击的方法。下面的技能就是一个例子:

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

未命名触发器 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 秒 普通 类型的生命周期对 (最后创建的单位)



未命名触发器 002
事件
单位 - 任意单位 死亡

条件
((死亡单位) 的类型) 等于 弓箭手

动作
单位 - 删除 (死亡单位)



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

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

演示-概率范围眩晕.w3x (18.15 KB, 下载次数: 242)
               不可否认,这种方法很简单,不过它有个致命弱点,那就是S流。
         所谓S流,就是攻击然后狂按S键。目的是为了使如上方法制作的被动技能的技能效果多次发动。会有这个问题的原因是单位 - 任意单位 被攻击这个事件的响应时在攻击单位真正的攻击前,也就是在攻击前摇没有结束前就响应了事件。当技能效果发动后,玩家还可以通过发布停止命令来打断单位的普通攻击。于是技能效果就不断的叠加。
         解决的方法是用单位接受伤害事件:单位 - (XXX) 接受伤害)。不过这个事件也不是那么完美。关于这个我们先不去研究,我们先看一个技能。
这是演示:近战抵抗护盾
近战抵抗护盾.w3x (23.95 KB, 下载次数: 203)
                  
           这是个比较复杂的技能,你可以打开这个帖子来看详细的说明:
T的局域化与变量传递研究演示技能——近战抵抗护盾
https://www.ou99.com/thread-82441-1-1.html
现在我们不是要研究整个技能,我们只要注意startreg,reg,attacked这三个触发就行。其中startreg,reg两个触发的存在意义就为attacked注册事件。我们使用这样的方法正是因为接受伤害事件的第一个问题——正常使用时只能选择初始放置在地图上的单位。
       另外的一个问题是:这个事件所判断的是伤害,我们无法用它区分开技能伤害还是普通伤害,然而我们的技能要求是普通攻击附带,而释放技能时不会产生效果。因此,我们不得不用条件来做区分。
       可以区分的有如下几个方面:1、伤害值。技能伤害是特定的值(有益技能的伤害是0),我们可以通过设置英雄的普通伤害是某个特别的值来区别,具体可以使用-1被的致命一击或者其他方法(例如上面的近战抵抗护盾,就是判断反弹伤害的值)。2、魔法效果。大多时候,我们都是使用这个方法,只要判断攻击目标身上是否有特定BUFF就行。不过因为有法球冲突,这样的判断还是有问题的。3,结合者两条。基本上这种方法都是用-1倍带魔法效果的致命一击+0伤害值判断。然而因为带有魔法效果的致命一击会打断目标施法(这个BUFF的效果基本上与重击一样)。
           
       关于被动技能所要说的就这么多。其他的方面参考普通主动技能的制作即可,如果想添加上概率的话,在被注册的触发加上一个判断随机数是否大于某个数的条件即可。
startreg
事件
时间 - 当游戏逝去 0.00 秒

条件
动作
循环动作[I]从 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




ou99孽缘 title=
 楼主| 发表于 2010-12-14 18:23:46
{:6_306:}
自己路过
q913874292q
发表于 2011-1-9 22:56:41
不懂
夕颜
发表于 2011-1-20 19:42:06
学习了
jostu
发表于 2011-1-20 21:13:38
完全看不懂的路过
csd0440
发表于 2011-2-4 22:54:49
uiopip
极道神光
发表于 2011-2-9 15:51:38
擦汗,。。。。。。。
yyk1205
发表于 2011-2-19 11:18:28
太深奥了!{:6_274:}
发表于 2011-3-5 10:58:33
话说 你们谁懂了?
q914027351
发表于 2011-3-5 20:16:41
看下{:6_306:}
快速回复 返回顶部 返回列表