工具質(zhì)地和盔甲質(zhì)地(Material)(上)
新的ToolMaterial,武器/工具質(zhì)地
新的ArmorMaterial,盔甲質(zhì)地
以上代碼一般寫在ModItems里,但實(shí)際上如果你搞明白本質(zhì),寫在哪無所謂。
說白了就是原版用了枚舉,以至于我們沒法直接地構(gòu)造XXMaterial對象,需要靠forge提供的黑魔法EnumHelper來添加。
一個常見的錯誤,是setRepairItem里所指定的物品寫在了后面,導(dǎo)致不能修理??次仪懊鎀oolMaterial的示意,BLOOD_IRON_INGOT的聲明在TOOL_MATERIAL_BLOOD后面。如果你把順序調(diào)換,會導(dǎo)致setRepairMaterial調(diào)用的時候,BLOOD_IRON_INGOT對應(yīng)的構(gòu)造函數(shù)還沒調(diào)用,修理材料被設(shè)置為null而失靈。都是淚。

Material這個詞,很多人第一反應(yīng)是“材料”,但是MC里有太多類似的概念,所以這里我先稱之為質(zhì)地。叫它什么無所謂,總之是這么個東西。
在大寶劍那課,我講了使用“Item.ToolMaterial.DIAMOND”引用原版的鉆石質(zhì)地。好,現(xiàn)在問題來了,如果我不想用鉆石,而是想用一種我mod自己引入的東西維修怎么辦?
在回答這個問題之前,我們先要搞清楚一件事:真的有必要引入一個新質(zhì)地嗎?

我們回想一下原版不同質(zhì)地的劍或者鎬有什么區(qū)別。
首先,鉆石劍和木劍的傷害不一樣。那么,為了做出傷害不一樣的劍,就要寫不同的質(zhì)地嗎?其實(shí)不用。我們看一段代碼,來自ItemSword:
劍之所以有傷害加成,都是在這寫出來的。你覆寫這函數(shù),甚至能讓劍加盔甲值和生命上限。這里攻擊的加成數(shù)值是attackDamage,他是一個private final float變量,不好修改,尷尬至極。要想改攻擊加成,只能直接重寫這個屬性修改器的整個方法getItemAttributeModifiers。
ItemSword里有個getAttackDamage,但那玩意不管用。他是AI生物判斷要不要換武器時用的,光覆寫這玩意不影響傷害。

鉆石和鐵耐久度也不一樣,但你也看到了,setMaxDamage就解決了。所以單純做一個耐久度問題的話,也用不著管材質(zhì)。
金的東西更好附魔。對的,我們來看這個接口:
看見沒,這個也能無視材質(zhì)手寫。
那用來修理的物品呢?你總不能用金錠修鉆石鎬……
嗯,sorry,有接口真的了不起。你改這個接口,真的能寫出一個道具可以同時被金、鐵、鉆石甚至是木炭修復(fù)。
挖掘速度?ItemTool里有個protected float efficiency,斧子和鎬子用到了,你改就行。是的,鉆石劍和木劍挖泥巴速度一樣,因?yàn)椴粰z測材質(zhì)。
挖掘等級?來看看ItemPickaxe::canHarvestBlock。你甚至可以寫出一個能挖黑曜石,卻不能挖鐵礦石的鎬子。所謂挖掘等級這種概念,只有你照顧它的時候才有意義。
那沒了,對吧。所有ToolMaterial的問題都能靠覆寫接口解決。那為什么還要有ToolMaterial?為了像mc那樣一做一整套,即使鉆石鋤實(shí)際上幾乎沒有玩家去合成,鉆石鎬則是大家的共同目標(biāo)。不然,你隨便繼承個什么質(zhì)地,然后覆寫接口就可以了。

盔甲的問題則比較復(fù)雜。物品就只有一張貼圖,盔甲穿在身上還有另外兩張——對的,兩張,實(shí)際上盔甲有兩個圖層,各有一張,再加手上的物品圖標(biāo),一共三張。
當(dāng)然了,這是指你打算正常制作普通盔甲,而不是那種有特殊模型(比如犄角)的情況。
先說到這里。下篇直接咕了,啥時候有空啥時候?qū)憽?/p>