
今天開始來說說配方(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. 第一部分用來描述這個合成配方會使用的位置對應,規定每一個字串都需要用雙引號"包起來。舉例來說:
 
 
 or
 or  
 or
 or  or
 or  or
 or  
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
這部分倒是提示我表達式好像有點問題...我再來修改一下