[环世界]一个护甲减伤的BUG(?)
首先要对海星地联致歉,之前他的视频提到利器伤害经过护甲减伤后仍然是利器,我反驳了他,后来在跟一位贴吧老哥讨论的时候自己测试了一下,发现他的结论是对的。准确地说:子弹(利器)穿过护甲减伤后伤害类型变为钝器,但仍然计算的是利器的护甲值。这是因为方法里的一个BUG,我将在后文提出。
测试说明:
原MOD是Girls' frontline Apparel Pack汉化整合版,我修改了一下数据。这个MOD的服装会覆盖头部以下包括指头的所有部位,比较方便测试。
传奇皇家禁卫头盔200%利器甲,防止被爆头
M16A1是内层200%钝器甲,
SOP是内层200%利器甲,
M16A1无武器版是外层125%利器甲,
传奇突击25%破甲,确保能刚好被外层护甲减伤。


按理说,子弹伤害经过外层护甲减伤后会变为钝器伤害,破甲值不变,再经过内层衣物钝器护甲值的判定减伤,再对小人造成伤害,所以内层衣物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修复,肥肠的完美。(可是为什么仍然是Nails倒下了?)
所以现在结论也很明显了,在泰南正式修复之前,死命堆利器护甲就行了,钝器甲?那是什么,好吃吗?
(UP不是专业程序员,只是一时兴起入门C#。如有疑问,欢迎讨论)