[環(huán)世界]一個(gè)護(hù)甲減傷的BUG(?)
首先要對(duì)海星地聯(lián)致歉,之前他的視頻提到利器傷害經(jīng)過(guò)護(hù)甲減傷后仍然是利器,我反駁了他,后來(lái)在跟一位貼吧老哥討論的時(shí)候自己測(cè)試了一下,發(fā)現(xiàn)他的結(jié)論是對(duì)的。準(zhǔn)確地說(shuō):子彈(利器)穿過(guò)護(hù)甲減傷后傷害類型變?yōu)殁g器,但仍然計(jì)算的是利器的護(hù)甲值。這是因?yàn)榉椒ɡ锏囊粋€(gè)BUG,我將在后文提出。
測(cè)試說(shuō)明:
原MOD是Girls' frontline Apparel Pack漢化整合版,我修改了一下數(shù)據(jù)。這個(gè)MOD的服裝會(huì)覆蓋頭部以下包括指頭的所有部位,比較方便測(cè)試。
傳奇皇家禁衛(wèi)頭盔200%利器甲,防止被爆頭
M16A1是內(nèi)層200%鈍器甲,
SOP是內(nèi)層200%利器甲,
M16A1無(wú)武器版是外層125%利器甲,
傳奇突擊25%破甲,確保能剛好被外層護(hù)甲減傷。


按理說(shuō),子彈傷害經(jīng)過(guò)外層護(hù)甲減傷后會(huì)變?yōu)殁g器傷害,破甲值不變,再經(jīng)過(guò)內(nèi)層衣物鈍器護(hù)甲值的判定減傷,再對(duì)小人造成傷害,所以內(nèi)層衣物200%鈍器防御的小人應(yīng)該更加堅(jiān)挺才對(duì)。但是多次試驗(yàn)的結(jié)果卻正好相反,內(nèi)層200%利器甲的小人反而站得更久,這是為什么呢?
BUG溯源:
下圖的方法是ArmorUtility類里的,作用是受到攻擊的傷害計(jì)算
大致原理如下(我不是專業(yè)學(xué)C#的,只能看個(gè)大概,有問(wèn)題歡迎討論):

注意紅框的部分,在衣服減傷循環(huán)之前獲取了damageDef(傷害類型)對(duì)應(yīng)的護(hù)甲值,之后在循環(huán)中雖然使用了ref?damageDef來(lái)強(qiáng)制更新,但是GetStatValue(armorRatingStat, true)中卻并沒有,所以獲取的始終是初始的damageDef值。子彈傷bullet,對(duì)應(yīng)的是利器護(hù)甲,也就是不管衣服穿多厚,盡管被減傷后受到的是鈍器傷害,但始終是按利器護(hù)甲進(jìn)行計(jì)算。
為什么我說(shuō)是BUG,而不是泰南故意為之呢?
因為如果想要子彈穿過(guò)護(hù)甲不改變傷害類型,只需要在循環(huán)結(jié)束后進(jìn)行if (damageDef.armorCategory == DamageArmorCategoryDefOf.Sharp){damageDef = DamageDefOf.Blunt;}就可以了,沒有必要使用ref?damageDef這么復(fù)雜的變量來(lái)實(shí)時(shí)更新。
嘗試修復(fù):

如圖,要讓armorRatingStat及時(shí)獲取最新的值,只需要把賦值放在循環(huán)內(nèi)進(jìn)行就可以了。
下面還有一段是肉身的護(hù)甲減傷計(jì)算,記得也要賦值。(肉身可以看做最內(nèi)層無(wú)耐久的衣物)
測(cè)試一下:

可以看到內(nèi)層利器護(hù)甲的小人被鈍器護(hù)甲的小人打翻了,BUG修復(fù),肥腸的完美。(可是為什么仍然是Nails倒下了?)
所以現(xiàn)在結(jié)論也很明顯了,在泰南正式修復(fù)之前,死命堆利器護(hù)甲就行了,鈍器甲?那是什么,好吃嗎?
(UP不是專業(yè)程序員,只是一時(shí)興起入門C#。如有疑問(wèn),歡迎討論)