今天開始來說說配方(recipe)的功能。在Minecraft世界內,有三種不同類型的配方:
我們先從合成開始吧!
合成是在Minecraft世界中要生存一定要學會的技能。我們在[第二天]有提到樹木可以用來合成工作台,而合成得到的工作台就是利用配方(其實是有形配方)並且使用合成類型。
我們這邊就從工作台的配方來說明我們要如何製作新的合成配方。
在Forge的原始程式碼內,net.minecraft.item.crafting
套件下有一個RecipesCrafting
類別,這裡定義了一些基礎的合成配方,在其中有一個工作台的合成配方程式碼:
p_77589_1_.addRecipe(
new ItemStack(Blocks.crafting_table),
new Object[] {"##", "##", '#', Blocks.planks}
);
p_77589_1_
代表的是CraftingManager
物件,不是重點我們先不要管它。
我們看addRecipe()
提供的兩個參數:
ItemStack:由這個配方所產生的物品堆(ItemStack),這邊定義了這個合成配方所摻生的物品是什麼(只會有一個物品,但可以是複數);我們這邊定義這個配方產生的東西是Blocks.crafting_table
,即工作台方塊這個物件。
recipeComponents:配方定義的內容。這邊會使用一個Java物件陣列包裝,這個物件陣列的內容格式我用Regex正則表達式來說明:
第一部分:(\".{1,3}\"){1,3}
第二部分:\'\S\'
第三部分:Item、Block或ItemStack物件
a. 第一部分用來描述這個合成配方會使用的位置對應
,規定每一個字串都需要用雙引號"
包起來。舉例來說:
b. 第二部分與第三部分是一組的,這裡規定第二部分的字元都需要用單引號'
包起來。用來描述合成配方中的字元代表是什麼物品
。舉例來說:
X
這個字元代表是沙
這個方塊#
這個字元代表是蘋果
這個物品A
這個字元代表是玻璃
這個方塊,而B
這個字元代表是鑽石劍
這個物品回到一開始的工作台合成配方:
addRecipe(
new ItemStack(Blocks.crafting_table),
new Object[] {"##", "##", '#', Blocks.planks}
);
這裡就可以很清楚知道它的製作方式:
需要連續兩列,並且連續兩行都是使用任意類型的木材
我們這邊先使用有形配方合成我們前幾天新增加的終界方塊:透過擺放泥土方塊成一個"X"字形可以獲得。
FMLInitializationEvent
事件方法內,加上下面這段程式碼:
@EventHandler
public void init(FMLInitializationEvent event) {
GameRegistry.addRecipe(
new ItemStack(enderBlock),
"X X",
" X ",
"X X",
'X',
Blocks.dirt
);
}
這裡細心的邦友可能會發現:為什麼這裡我們沒有用new Object[] {}
的方式敘述參數內容,而是直接一個一個參數用逗號分開呢?一個到多個的Object變數,或是直接給一個Object陣列
。這裡如果你用物件陣列的方式寫,Intellij也會提示你這裡可以直接使用多個參數,不用額外宣告一個物件陣列。無形配方與有形配方只有一個差別:無形配方不行定義內容。
可以這樣思考:有形配方通常是有一個"聯想"的方式,由配方內容與擺放位置來得到合成的物品(如四個木材可以合成四方形的工作台);而無形配方就沒有任何形狀可以想像。
我們這裡就加一個無形配方,讓1個終界方塊可以直接建立9個白色藥丸。
一樣回到主程式,在前面加的有形配方後面,再加上我們的無形配方程式碼:
@EventHandler
public void init(FMLInitializationEvent event) {
// 有形配方
GameRegistry.addShapedRecipe(
new ItemStack(enderBlock),
"Z Z",
" Z ",
"Z Z",
'Z',
Blocks.dirt);
// 無形配方
GameRegistry.addShapelessRecipe(
new ItemStack(pillItem, 9),
enderBlock
);
無形配方只需要兩個參數:
ItemStack
物件,這裡我們產生9個藥丸物品。存檔進入遊戲,現在可以將終界方塊產生9個加速小藥丸了!以後看到苦力怕再也不會怕怕了!
注意這裡的終界方塊不管放哪裡都可以產生藥丸物品喔,有興趣的人可以試看看。
原來合成程式碼regex長這樣XD
這是我根據原始碼去推斷的,原本程式碼並沒有這樣的正則表達式喔XD
這部分倒是提示我表達式好像有點問題...我再來修改一下