找回密码
 点一下
查看: 4812|回复: 32

普攻伤害判断实现深探的碎碎念……

[复制链接]
发表于 2009-6-26 21:02:13 | 显示全部楼层 |阅读模式
关于普攻伤害判断,一种是全局伤害事件动态注册+buffplacer判断buff,一种是获取攻击目标时注册伤害事件(dota的方法)
第二种方法有个bug是做出攻击动作时再使用其他伤害物品(dagon)会一样作为普攻判断;感觉这种方法更适合为少数技能的实现而存在,不太适合对所有单位都有普攻伤害判断的情况

第一种方法的话,我想到了一个变种是对所有技能都进行模拟(比如锤子,改成cast effect时让dummyunit扔锤子),这样伤害事件触发时,只要伤害来源不是马甲单位就肯定是普攻

而如果采用buffplacer的方法,虽然因为打算把法球(包括自动释放法箭)全部模拟,不用担心orb effect/buff placer叠加问题

但这两种方法都面临同一个问题:那就是对于弹射/溅射/穿透/分裂/粉碎都有些问题,如果说对于分裂和粉碎还可以通过设定虚技能对自己有效然后模拟的话(粉碎还无视魔免但视抗性,更麻烦),前三种就很难办了,除非模拟……但模拟的话,如何确定本来的攻击力呢?

对于近战来说,可以用100%(当然也可以不是这个数)只对自己有效的分裂来探测,用免伤触发消除伤害,虽然打断药膏的问题可以模拟解决,但一定会调用attack slam动画这点却是很难解决的;而且毕竟这个方法对远程无效……

对于远程,我突然想到可以用对自己有效的分裂箭判定攻击出手(未测试),不过对于判定攻击伤害就无能为力了(更别提获得攻击力)

then,如果不考虑记录所有影响攻击因素然后计算的方式(这种方法不能保证随机一致),那我们只能用把护甲伤害衰减因子改成0然后模拟护甲减伤了……
但……护甲伤害伤害衰减因子是无法影响负数的……负甲永远是按2-0.94^x计算

不过反正要这样做的话,是需要手动计算护甲的,因素就是基础护甲、科技、敏捷、物品、光环及主动buff几类,暂且算可以接受吧……(也可以由此做“伤害 = 攻击 - 护甲”模式)

嗯暂时想到这些…
发表于 2009-6-26 21:37:55 | 显示全部楼层
引用某贴libla于2009-06-05 16:34发表的  :
每次受到伤害自己伤害自己,获得护甲减免百分比,然后把受到的伤害除这个百分比

如果已知攻击单位的攻击类型的话,上面的方法是可以获取到单位本来的攻击力的。
回复

使用道具 举报

 楼主| 发表于 2009-6-26 22:35:22 | 显示全部楼层
呃…nc了…这个精度可能有点问题但不大

不过如果应用到所有伤害事件上,会不会卡…2倍伤害事件了
回复

使用道具 举报

发表于 2009-6-26 22:44:02 | 显示全部楼层
很简单
给所有单位加上一个名字为 普攻的被动技能 有持续buff没有效果
比如伤害为0的毒药。。持续为0既无限
然后 注册所有单位接收伤害事件。。
如果 单位有BUFF那么代表是普通攻击。。
删除BUFF。。

其他被动技能其实也这么做。。
把BUFF改了就是了。。

主动技能不会有同样的BUFF这样 就可以判断了。。

这个地图、所有单位就注册一次伤害事件就ok了
然后 给触发添加动作就可以做被动技能了
回复

使用道具 举报

发表于 2009-6-26 22:46:51 | 显示全部楼层
引用第2楼westwood于2009-06-26 22:35发表的  :
呃…nc了…这个精度可能有点问题但不大

不过如果应用到所有伤害事件上,会不会卡…2倍伤害事件了

还行吧,并不是所有的模拟都需要获取原始攻击力吧。
Hmmm,说实话我也不是很清楚。
回复

使用道具 举报

 楼主| 发表于 2009-6-26 23:16:08 | 显示全部楼层
但是如果改变护甲减伤方式的话,每个次伤害都要计算护甲并修正…
引用第3楼囧rz..于2009-06-26 22:44发表的  :
很简单
给所有单位加上一个名字为 普攻的被动技能 有持续buff没有效果
比如伤害为0的毒药。。持续为0既无限
然后 注册所有单位接收伤害事件。。
如果 单位有BUFF那么代表是普通攻击。。
.......

这些我倒是知道…问题在于对于弹射/溅射/穿透等攻击方式就存在问题,如果想完美实现就要牵扯到攻击力获取等问题
回复

使用道具 举报

发表于 2009-6-26 23:19:06 | 显示全部楼层
那些直接模拟
不然会跟麻烦
回复

使用道具 举报

 楼主| 发表于 2009-6-26 23:41:19 | 显示全部楼层
对阿,不获得攻击力,怎么完美模拟阿……
回复

使用道具 举报

发表于 2009-6-26 23:46:39 | 显示全部楼层
你注册伤害事件 你就可以得到伤害啊.
这个伤害 是算防御还是不算防御 我没试过
不过 你既然知道伤害..
模拟也不是很困难吧

在说完美是相对的..
如果非要精确到几点的伤害
也觉得没有必要
回复

使用道具 举报

 楼主| 发表于 2009-6-26 23:55:27 | 显示全部楼层
这个伤害是扣防后的,如果不获得扣甲前的值不就没法完美模拟了么(你知道dota里ta
两刀秒tb的"bug"么)

那还得设法获得护甲……
回复

使用道具 举报

发表于 2009-6-26 23:59:56 | 显示全部楼层
如果是防后伤害也没有问题啊
防后伤害
比如分裂 30%
你把这个伤害*0.3 然后 直接设置单位生命 这个伤害就精确了..
如果是防前的话
用伤害单位函数来做
回复

使用道具 举报

发表于 2009-6-27 00:05:16 | 显示全部楼层
好像还有点问题..
被伤害单位也要计算护甲
不过这点东西 也无关紧要吧
就算能做
我认为 也是 付出大于获得
回复

使用道具 举报

 楼主| 发表于 2009-6-27 12:31:55 | 显示全部楼层
显然是防后伤害……

除了分裂,其他伤害都是算各自护甲的,大哥……你以为打0防的就能把旁边1w防的溅射死么……
回复

使用道具 举报

发表于 2009-6-27 17:13:20 | 显示全部楼层
临时创建触发有一定几率失败,我测试过
回复

使用道具 举报

 楼主| 发表于 2009-6-27 18:15:00 | 显示全部楼层
你是说dota那种方式?

有清楚原因么,,
回复

使用道具 举报

发表于 2009-6-27 18:54:11 | 显示全部楼层
= =我把护甲类型伤害参数改成了0% ..  
于是可以捕捉普通攻击伤害 = =. (伤害值为1, 伤害来源不是马甲..)
单位所有属性用变量记录了... 真实伤害用马甲输出..
技能伤害也都用马甲..
分裂什么的都用的模拟= =..
回复

使用道具 举报

发表于 2009-6-27 18:56:35 | 显示全部楼层
引用第15楼天零萃梦于2009-06-27 18:54发表的  :
= =我把护甲类型伤害参数改成了0% ..  
于是可以捕捉普通攻击伤害 = =. (伤害值为1, 伤害来源不是马甲..)
单位所有属性用变量记录了... 真实伤害用马甲输出..
技能伤害也都用马甲..
分裂什么的都用的模拟= =..
这个就是在不考虑这种方法和类似方法的基础上的研究
回复

使用道具 举报

 楼主| 发表于 2009-6-27 19:36:02 | 显示全部楼层
引用第14楼westwood于2009-06-27 18:15发表的  :
你是说dota那种方式?

有清楚原因么,,

负甲时就不完美了…还要纠正过来…
回复

使用道具 举报

发表于 2009-6-27 20:26:13 | 显示全部楼层
纠正啥..

在输出函数里加句对负防御的判断然后换个公式就可以啦= =.
回复

使用道具 举报

发表于 2009-6-28 09:56:53 | 显示全部楼层
麻烦……………………要是有觉悟就直接模拟整个魔兽的普攻系统好了…………所有单位收到普攻的伤害永远为X,此时再用计算出来的攻击者的攻击力+防御者的护甲类型+一大堆公式+Damge函数对单位造成伤害,当然你要想获得攻击者的攻击力,你还要模拟Buff和Ability系统………………剩下的……你就会发现你被套进去了…………
曾经做过,建议不用尝试这种方法了。
现在把这个系统改成用AttackBuff制作了,还可以~~~我很支持AbilityBuff+模拟溅射什么的…………
毕竟溅射魔兽自己本身还有Bug呢~~(不知道现在解没解决)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 16:23 , Processed in 0.108829 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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