
在這一期教程中,我們首先要了解一些基本概念,然後開始為我們的物品或者方塊添加功能。首先要觀察一張圖,左邊顯示了我們在代碼中定義並註冊的對象,我們註冊過item、註冊過block,而block eterm是由block自動生成的item,也屬於一種item。這些都是我們定義並註冊的東西,在註冊時已經生成了實例。在註冊時使用了new block這個構造函數,直接生成了一個實例,整個遊戲只有這一個實例。雖然世界上有很多方塊,但實際上所有方塊都是block state的實例,而所有block state實例都擁有同一個block實例。這樣做的好處之一就是可以使用等號來判斷是否是目標物品或方塊,因為Java對象比較實際上是比較對象的地址而不是內容。所以如果整個世界只有一個物品實例、一個方塊實例,你想要判斷是什麼物品時可以直接用等號判斷,因為它們的地址都是相同的。

另外,item在揹包裡是item stack對象,類似地,block state在世界上是掉落在地上的物品對象,而INT entity對象則代表一個實體。這些是一些基本概念。現在我們要給我們的物品或者方塊添加功能,一個簡單的想法是自定義一個物品,當對著我們的方塊右鍵使用時,這個物品會消失,並讓該方塊吐出一個東西,比如烤魚。我們可以把這個物品命名為"Exchange Voucher",將方塊命名為"Vending Machine"。這個功能相對簡單,我們第一步肯定是把方塊的名字改成"Vending Machine",英文暫時保留不變,畢竟暫時不需要調整語言設置。這裡涉及到物品與方塊的互動,我們可以想象一些交互形式,比如以物品為主體,判斷使用物品時瞄準的方塊是否是目標方塊,這是一種方法。

第二種方法是以方塊為主體,判斷玩家手持的物品是否是目標物品,這也是一種互動方式。這兩種方法都可以實現我們的需求。這次我們要自定義一個item,而不再直接使用block生成的block item。要自定義一個item,就需要將其註冊進去,但簡單註冊的item是沒有什麼交互功能的。所以我們需要給我們的物品添加交互功能,可以參考原版中是怎樣實現的。
首先看看原版中的word item裡面,找一個交互比較簡單的物品,比如剪刀。在剪刀的類中,可能會有一些與開採方塊相關的內容,我們暫時不需要這部分。其中可能會涉及到獲取破壞速度之類的屬性,這個暫時也不需要。看起來與實體的互動有關,暫時做個記錄。
接著,發現一個名為"UZ"的方法,似乎很有趣。"UZONE"看起來像是當你使用了這個物品後的效果。再看這個事件,首先獲取了方塊,然後判斷該方塊是否屬於正在生長的植物的頂部方塊,如果還沒有長到最大,獲取玩家信息和玩家手上物品的信息,然後觸發某種進度。這個可以看到涉及到了advancement包,與遊戲進度相關。
然後播放聲音,觸發聲音效果,接著獲取一個block state,重新設置了方塊的更新,最後觸發了世界。通過這些步驟,我們可以使用"UZONE"來獲取方塊並進行邏輯判斷。
首先,我們需要在item包下創建一個新的類,比如命名為"ExchangeVoucher",讓其繼承自Item類。在這個類中,我們可以實現與"UZONE"類似的邏輯,用於處理交互事件。
我們首先要複製"UZONE"中的相關方法和邏輯,確保我們的"ExchangeVoucher"類也能獲取方塊信息,並進行必要的判斷。這樣才能正確處理玩家與方塊的互動。
在檢查方塊是否符合需求後,如果方塊符合條件,我們就需要創建一個物品。通過獲取玩家信息,我們可以在適當的時候將物品添加到玩家的揹包中。這裡可以直接參考原版的實現方式,例如創建一個新的ItemStack對象,該對象包含有關我們要生成的物品的信息。
為了創建正確的物品,我們可以參考原版遊戲中已註冊的物品,比如Cookie,查找其對應的代碼,以便正確設置我們自定義物品的屬性,例如名稱、圖標等。這樣我們就可以成功地添加一個具有互動功能的自定義物品了。
接著我們需要處理返回的邏輯。當成功執行後,我們需要返回相應的結果;當執行不成功時,同樣也需要返回對應的結果。在成功執行後,我們可以參考之前的shares來處理返回值的部分。
兌換券製作完成後,接下來要將其註冊到遊戲中。我們可以使用類似以下代碼來註冊兌換券:
public static final RegistryObject<Item> EXCHANGE_VOUCHER = ITEMS.register("exchange_voucher", () -> new ExchangeVoucher());
然後,我們需要測試一下效果。可以看到物品已經成功添加到了遊戲中,並可以通過GV(遊戲內GUI)獲取到兌換券,最終用兌換券來獲取烤魚等物品。
接下來,我們需要完善邏輯。兌換券不能無限使用,每次使用後數量都應該減少,同時可能需要更改材質。這些需求需要通過修改代碼來實現。我們可以參考其他類似的實現方式,比如根據物品的耐久度來控制數量的減少。在ItemStack類中找到類似減少物品數量的方法,例如setCount(),並參考其實現方式,通過調整數量來實現兌換券的有效次數減少功能。
為了給兌換券創建貼圖,我們需要按照以下步驟進行操作:
1.首先在資源管理器中打開域文件,然後在其中新建一個名為"exchange_voucher.json"的文件。
2.將鈴鐺等簡單物品的模型代碼複製到"exchange_voucher.json"中。
3.修改文件中的"parent"為"HASTMOD:item/exchange_voucher",確保正確繼承了父級模型。
4.在textures文件夾下的item文件夾中創建一個新的貼圖文件,例如"exchange_voucher.png"。
5.參考原版材質設計,使用圖片編輯軟件創建兌換券的貼圖,可以繪製自定義圖案和顏色。
6.將自定義的貼圖保存為"exchange_voucher.png"並替換掉原有的樣本圖片。
7.運行遊戲,檢查兌換券的材質是否已經更新,然後通過生存模式測試兌換券的數量減少功能。
通過這些步驟,兌換券將擁有自定義的貼圖和正確的數量處理邏輯。完成後,您可以在創造模式中找到該物品,並測試其功能。