Mod里制作劍(四)

深湖:我想在正式開始之前,我應該糾正我在第二篇里的一個錯誤,或者說是含混的地方。
淺海:哪里?
深湖:我當時是這么說的:
正確答案是,當你的屬性修飾符(AttributeModifier)的UUID為特定的兩個值的時候,這項修正顯示灰色最終值;否則的話,顯示藍色正加成或者紅色負加成。
淺海:我做了實際嘗試,確實是這樣的???
深湖:只是格式上確實是這樣,但是顯示的具體數(shù)字內容不是。
舉例來說,你使用了ATTACK_SPEED_MODIFIER(攻速修飾符)修改了……攻擊傷害屬性,修改內容為“加2”,那么這里顯示的不是你的總攻擊傷害,也不是你的基礎攻擊傷害+2。它的值是你的基礎攻擊速度+2,但是描述是“X 攻擊傷害”,驢唇不對馬嘴。這就是上面你看到有兩條攻擊傷害屬性,還自相矛盾的原因。
如果你感興趣的話,上圖對應的的代碼是:
因此,攻擊修飾符就修飾攻擊,攻速修飾符就修飾攻速,不要亂搞了。
此外,因為這顯示的不是最終值,而是基礎值+修正值后的結果。如果有多件用這個UUID修正同一個屬性的裝備——當然他們會因為UUID互相沖突而無法同時生效——這東西也只能預覽這一件的理論效果。
對,這玩意總是按照加法來預覽,所以如果你是百分比+100%,他不會按照攻速(基礎值為4)的4*(1+100%)=8來計算,而是會算出錯誤的4+100%=500%。很愚蠢。所以這個UUID的修飾符還是留給類型為0的加法修飾符吧。
淺海:好的。說了這么多,總之我不按照原版未計劃的方式使用這兩個UUID的修飾符,就不會有問題,對吧?而且即使有也只是顯示問題。
深湖:對!就是這樣。
淺海:那么今天我們講修飾符的另一個要素,也就是具體的修正值?
深湖:對。這一項很好理解。如果值填3,那么它類型為0(普通加法)的時候,就是屬性+3;為1或者2(百分比加成)的時候,就代表+300%。
淺海:也就是說,如果我修正值填10000,類型為0(普通加法),就能讓玩家拿著的時候,攻擊力是……基礎的1點,加10000,最后是10001。
深湖:錯了。
淺海:為什么?

深湖:如圖。最后的結果是2048。如果你去SharedMonsterAttributes里去看看它的定義,就會知道攻擊力這條屬性被限制在0~2048,根本沒法達到一萬。你的加成再多,也頂不出這個限制。
淺海:可我做出來,看到預覽的時候確實是10001攻擊傷害?。?/p>
深湖:我想前面你看過那個代碼的實現(xiàn)原理了,這個數(shù)值不可靠,他總是返回基礎值加修正值,而非實際的屬性最終值。你應該做的是實際獲取屬性值看一眼,就比如這樣……
淺海:我試試……為什么我獲取出來屬性值為1?超出范圍的修飾符會被丟棄嗎?
深湖:不會丟棄。獲取出來為1是你獲取的方式不對。要么你是獲取了BaseValue(基礎值),要么是因為你試圖在前端獲取攻擊傷害這條屬性。
如果你仔細看過這些屬性的定義的話,你會發(fā)現(xiàn)有的屬性在構造的時候,沒有進行setShoudlWatch(true),也就是說前端是根本不知道你最后身上的實際攻擊力是多少的。哦,基礎值還是知道的,如果這個基礎值是實體初始化的那個數(shù),也沒有被其他模組亂改過的話。
如果你想在前端臨時查看,最暴力的方法就是像我上面那樣給這個屬性,在后端的某個地方強行設置為setShouldWatch(true)。類似地,我記得有幾條屬性在1.12.2是watch的,在高版本又不watch了。在前端去試圖顯示東西的時候務必注意這條屬性是否會同步給前端。實際上,如果只是為了調試,那么在后端打條log就足夠了。