欢迎光临散文网 会员登陆 & 注册

[环世界]一个护甲减伤的BUG(?)

2022-03-01 20:23 作者:中沢伴行  | 我要投稿

首先要对海星地联致歉,之前他的视频提到利器伤害经过护甲减伤后仍然是利器,我反驳了他,后来在跟一位贴吧老哥讨论的时候自己测试了一下,发现他的结论是对的。准确地说:子弹(利器)穿过护甲减伤后伤害类型变为钝器,但仍然计算的是利器的护甲值这是因为方法里的一个BUG,我将在后文提出。


测试说明:

原MOD是Girls' frontline Apparel Pack汉化整合版,我修改了一下数据。这个MOD的服装会覆盖头部以下包括指头的所有部位,比较方便测试。

传奇皇家禁卫头盔200%利器甲,防止被爆头

M16A1是内层200%钝器甲,

SOP是内层200%利器甲,

M16A1无武器版是外层125%利器甲,

传奇突击25%破甲,确保能刚好被外层护甲减伤。

200%钝器被打倒
内层200%利器依然坚挺

按理说,子弹伤害经过外层护甲减伤后会变为钝器伤害,破甲值不变,再经过内层衣物钝器护甲值的判定减伤,再对小人造成伤害,所以内层衣物200%钝器防御的小人应该更加坚挺才对。但是多次试验的结果却正好相反,内层200%利器甲的小人反而站得更久,这是为什么呢?


BUG溯源:

下图的方法是ArmorUtility类里的,作用是受到攻击的伤害计算

大致原理如下(我不是专业学C#的,只能看个大概,有问题欢迎讨论):

在循环外获取了伤害类型对应的护甲

注意红框的部分,在衣服减伤循环之前获取了damageDef(伤害类型)对应的护甲值,之后在循环中虽然使用了ref damageDef来强制更新,但是GetStatValue(armorRatingStat, true)中却并没有,所以获取的始终是初始的damageDef值。子弹伤bullet,对应的是利器护甲,也就是不管衣服穿多厚,尽管被减伤后受到的是钝器伤害,但始终是按利器护甲进行计算。

为什么我说是BUG,而不是泰南故意为之呢?

如果想要子弹穿过护甲不改变伤害,只需要在循环结束后进if (damageDef.armorCategory == DamageArmorCategoryDefOf.Sharp){damageDef = DamageDefOf.Blunt;}就可以了,没有必要使用ref damageDef这么复杂


尝试修复:

修改为循环内及循环后获取

如图,要让armorRatingStat及时获取最新的值,只需要把赋值放在循环内进行就可以了。

下面还有一段是肉身的护甲减伤计算,记得也要赋值。(肉身可以看做最内层无耐久的衣物)

测试一下:

BUG修复

可以看到内层利器护甲的小人被钝器护甲的小人打翻了,BUG修复,肥肠的完美。(可是为什么仍然是Nails倒下了?


所以现在结论也很明显了,在泰南正式修复之前,死命堆利器护甲就行了,钝器甲?那是什么,好吃吗?

(UP不是专业程序员,只是一时兴起入门C#。如有疑问,欢迎讨论)

[环世界]一个护甲减伤的BUG(?)的评论 (共 条)

分享到微博请遵守国家法律