Mod里制作劍(二)
前篇:做劍一
淺海:所以我準(zhǔn)備開始做劍了。
深湖:那么今天我們討論代碼方面的問題。
淺海:會比上次的多嗎?
深湖:那就取決于你已經(jīng)懂多少了。好,我們從這個問題開始:鐵劍的攻擊加成是多少?

淺海:我打開游戲看到的是6。
深湖:錯了。
淺海:昨天你不是也說鐵劍的攻擊傷害是6嗎?
深湖:對,所以我今天問的是“鐵劍的攻擊加成是多少”,而不是“鐵劍的傷害是多少”。

淺海:這還有區(qū)別的嗎?
深湖:有。玩家徒手的攻擊傷害是1,拿著鐵劍的傷害是6,說明鐵劍的傷害加成是5。如果你仔細(xì)觀察過的話,你會發(fā)現(xiàn)武器、工具會顯示拿著的時候,玩家的最終傷害是多少,灰色的字;如果是盔甲的話,會顯示屬性加某數(shù),而且是藍(lán)色的字。
正因如此,你會清楚盔甲每一件【加】了多少數(shù)值,并且產(chǎn)生一個鐵劍上寫的數(shù)值就【是】它在代碼底層實現(xiàn)的數(shù)值的錯覺。
淺海:那么代碼底層的實現(xiàn)的實際情況是?
深湖:是玩家徒手攻擊力為1(半顆心)、攻擊速度為4(赫茲),手持其他物品的時候不顯示這個數(shù)字。當(dāng)你需要實現(xiàn)一個物品改變這些數(shù)值的時候,你需要以此為基礎(chǔ)做出修正。比如你希望做一個攻速為8的主手物品,那么你應(yīng)該做到的攻速加成是+4,而不是8;你想做一個攻擊為8的武器,那么你應(yīng)該在代碼里寫的是攻擊力為8-1=7。
淺海:原來如此。等等,劍的攻速是1.6,徒手的攻速是4,那豈不是……
深湖:對,劍在拖慢你進(jìn)攻的速度。因此,實際上他的攻速加成是負(fù)2.4。如果按照其他地方的顯示,它會顯示一個難看的紅字。


但mc顯然不希望你拿到一把劍的時候,天天看著那個攻速變慢而惡心,更何況你也不知道自己的徒手攻速是4、基礎(chǔ)攻擊是1,這點游戲里沒有地方說過。因此……他在某些時候會直接顯示最終計算結(jié)果,而非修正值。
淺海:所以,在武器和工具上顯示的是最終值,盔甲上顯示的是加成,因為盔甲有四件,都在修正同一個屬性?
深湖:就原版無nbt物品的表現(xiàn)來說是你這樣。但底層不是。
淺海:所以底層在主手里的是顯示最終值,盔甲欄的,比如“戴在頭上時”是顯示加成?
深湖:也不是。
淺海:所以是攻擊傷害和攻速顯示最終值,其他的顯示加成值?
深湖:也不是。
淺海:啊,我看到上面那個圖了,確實反駁了一切……
深湖:正確答案是,當(dāng)你的屬性修飾符(AttributeModifier)的UUID為特定的兩個值的時候,這項修正顯示灰色最終值;否則的話,顯示藍(lán)色正加成或者紅色負(fù)加成。
以下是ItemStack里的相關(guān)代碼。你作為萌新的話不用細(xì)看,只需要有個模糊印象,知道這個東西是寫在ItemStack::getTooltip里的就行。注意是ItemStack類,不是大家整天擺弄的Item類,這也是很多人找不到這代碼在哪的原因之一。
至于這兩個UUID具體是什么,它們是在Item里定義的。
淺海:什么什么?
深湖:首先,我想你不知道什么是屬性修飾符。
淺海:確實……不是很懂。
深湖:生物有屬性。生物都有最大血量這個屬性,多數(shù)的屬性你可以在SharedMonsterAttributes類里查找到。

淺海:monster,怪物,那么玩家的呢?
深湖:這個類名不應(yīng)該望文生義。
同一條屬性,比如血量上限(MAX_HEALTH),玩家和怪物用得是同一條。
另外,不是所有怪物都有這個類里的所有屬性,比如新人最常犯的一個錯誤是誤以為所有EntityLivingBase都有ATTACK_DAMAGE。實際上這玩意是EntityMob里注冊的,就連EntityLiving、EntityCreature里都不一定有。正因如此,如果你是試圖調(diào)用牛、羊之類動物的這條屬性,就會引發(fā)空指針報錯,因為牛根本就沒有ATTACK_DAMAGE這條屬性。實際調(diào)用的時候你記得要判定空指針,或者是注意觀察那些東西的注冊時機(jī)。


淺海:那如果給牛發(fā)一把劍,會報錯嗎?
深湖:不會。因為原版在這里做了判空處理,屬性修飾符只對這個生物確實存在的屬性生效。當(dāng)然,你拿在手里的時候,所有的屬性修飾符是都看得見描述的,但里面有幾條是玩家所沒有的屬性,所以實際上不會生效。比如玩家沒有FOLLOW_RANGE,也就是怪物的視野范圍,之類的。玩家沒有ai,不需要他,所以根本沒注冊這條。
淺海:所以……做劍的話只需要像原版一樣修改攻速和攻擊傷害就行了吧,別的我先不用。
深湖:你最好不用,那些屬性有很多個都挺坑的。新人做的時候,望文生義,不起作用的問題時有發(fā)生。
淺海:那么UUID是什么?
深湖:你可以看我的這篇文章。簡單來說就是個唯一id,這玩意相同的就視為同一個東西。如果你在今天看到一個身份證號為N的人,明天又看到了身份證號為N的人,那么這兩人應(yīng)該被視為同一個人。你不記得他的長相,或者說整容、變性也無關(guān)緊要,只要身份證號一樣,他們就會被系統(tǒng)認(rèn)為是同一個人。
淺海:啊……
深湖:我覺得你今天學(xué)的夠多了,可以先休息了。下周我們再具體談屬性修飾符的寫法。