教學/製作資料包

From Minecraft Wiki
Jump to: navigation, search
Information icon.svg
此特性為Java版獨有。

本教學介紹如何製作資料包

入門[edit | edit source]

資料包允許玩家加入及修改函數戰利品表、世界結構進度合成標籤維度述詞

什麼不該做[edit | edit source]

在製作資料包之前,有些事情是您不應該做的。這是「不應該做的事」的列表:

  • 發佈允許玩家在沒有從Mojang購買Minecraft的情況下遊玩的Minecraft版本或修改版。
  • 以任何方式發佈反編譯的Minecraft原始碼。

建立資料包[edit | edit source]

要建立資料包,請首先找到世界資料夾中的datapacks資料夾。

要查找世界資料夾,請在遊戲目錄中找到saves資料夾,預設情況下為.minecraft

  • 單人遊戲中,您可以選擇您的世界,點擊「編輯」,然後點擊「打開世界資料夾」。
  • 伺服器上,您可以打開其根目錄(server.properties所在的位置),然後打開world資料夾.。

打開datapacks 資料夾後,建立一個資料夾並打開。資料夾名即是資料包名,由您決定,但不能含有漢字!

打開新資料夾後要做的第一件事是建立pack.mcmeta檔案。這樣 Minecraft 才能識別該資料包

建立MCMETA檔案[edit | edit source]

參見:資料包§pack.mcmeta

在您剛剛建立的資料夾裡新建一個名為 pack.mcmeta 的純文本檔案。

注意

重新命名時,請確保檔案擴展名為.mcmeta而非.txt換句話說,刪除舊的擴展名。您可能會收到警告:如果改變檔案擴展名,可能會導致檔案不可用。但是這實際上表明你已正確重新命名pack.mcmeta檔案。

如果您使用的是Microsoft Windows並且看不到檔案擴展名,對於Windows 10,可以透過轉到「檔案資源管理器」的「查看」選單並選中「檔案擴展名」複選框來打開它們。對於Windows 10以下的Windows,可以取消選中資料夾設定中的「隱藏擴展名」。

FileExtensions.png

文本編輯器[edit | edit source]

理論上使用任何文本編輯器都可以。建議所選的文本編輯器支持JSON,JSON是mcmeta檔案和資料包中大多數其他檔案使用的格式。請注意,大多數文本編輯器不會將mcmeta擴展名識別為JSON文本。因此,您需要手動配置編輯器。

pack.mcmeta的內容[edit | edit source]

用文本編輯器打開pack.mcmeta,複製或鍵入以下內容:

{
  "pack": {
    "pack_format": 6,
    "description": "教程数据包"
  }
}

對於pack.mcmeta,可在資料包的描述和名稱中使用「§」符號(Minecraft格式化代碼)。

如果資料包用於1.17快照,則 pack_format應該為7。如果資料包用於1.16.2~1.16.5版本,則 pack_format應該設為6。如果資料包用於1.15~1.16.1,則 pack_format應該為5。如果資料包用於1.13~1.14,則 pack_format應該為4。 description可以使用字串或原始JSON文本。當您將游標懸停在/datapack list輸出的資料包名或進入建立世界的資料包介面時,這段內容將會顯示出來。

注意

這個檔案是用JSON編寫的!本教學現在沒有詳細介紹格式,但要注意,不要忘記引號、冒號、圓括號和方括號。缺少任意一個都可能導致您的資料包無法正常工作!您可以使用JSON驗證器檢查您的檔案,例如 JSONLint

測試您的資料包[edit | edit source]

如果你建立了pack.mcmeta,嘗試在遊戲中測試它!打開Minecraft,進入世界或輸入/reload(如果你已經進入了世界),然後輸入/datapack list。此時應該出現兩條資訊:第一條是[vanilla],第二條應該是[file/(您的数据包的名称)]。當你將游標懸停在資料包名稱上時,你應該會看到資料包的描述,內容就像你在pack.mcmeta description中所寫的那樣。

當你的資料包出現時,你要準備好繼續前進。

故障排除[edit | edit source]

如果列表中沒有您的包,請確保pack.mcmeta的語法正確且已保存。看看有沒有缺少大括號{}、逗號,、冒號:,雙引號"",方括號[]。請記住,對於每個左大括號、雙引號或方括號,必須有一個右大括號、雙引號或方括號與之配對。

命名[edit | edit source]

參見:命名空間ID

在資料包資料夾中建立一個名為 data的資料夾,和pack.mcmeta在一個資料夾裡。在data資料夾中,您必須建立一個或多個資料夾作為命名空間。

資料包中的條目以命名空间:路径作為命名空間ID。相應的檔案將位於data/命名空间/(数据类型)/路径.(后缀)。請注意,路徑中的/字元將轉換為目錄分隔符。

例如:

  • ID為dummy:foo_proof/bar物品標籤將定位到data/dummy/tags/item/foo_proof/bar.json
  • ID為foo:handler/bar_call函數將定位到data/foo/functions/handler/bar_call.mcfunction

合法字元[edit | edit source]

資料包中的命名空間、路徑、資料夾名和檔案名應僅包含以下符號:

  • 0123456789 數字
  • abcdefghijklmnopqrstuvwxyz 小寫字母
  • _ 下劃線
  • - 連字號(減號)
  • / 正斜槓(不能用於命名空間)
  • . 句號(不能用於命名空間)

首選命名格式為以下劃線隔開的小寫字母單詞(lower_case_with_underscores),稱為蛇形命名法(lower snake case)。

命名空間[edit | edit source]

遊戲中的大多數對象都有一個命名空間(namespace),以防止潛在的內容衝突或無意的覆蓋。

例如,如果有兩個資料包為Minecraft分別加入了一個新的小遊戲機制,並且兩者都有名為start函數。如果沒有命名空間,這兩個函數就會衝突,小遊戲也會被破壞。但如果它們分別有minigame_oneminigame_two兩個不同的命名空間,則函數名分別為minigame_one:startminigame_two:start,就不發生衝突了。

大多數情況下Minecraft需要ID的存在,例如 /function 指令,路徑和命名空間缺一不可。如果命名空間未指定,則預設其為minecraft

新增內容時,請一定使用您自己的命名空間。僅當需要覆蓋其他東西,或是追加標籤的時候,才使用其他命名空間。

例如,Minecraft使用minecraft命名空間,這意味着只有當資料包需要覆蓋現有的Minecraft數據或將內容加入到原版標籤時才應使用此命名空間。

函數[edit | edit source]

參見:教學/指令方塊

函數是一系列順次執行的指令

要建立新函數,應在命名空間資料夾中新建functions資料夾。然後,在functions(或其子資料夾)中新建函數檔案函数名.mcfunction。這就是你的函數檔案。你的函數會被遊戲命名為(命名空间):(函数名称)或者當位於子資料夾時為(命名空间):(子文件夹1)/(子文件夹2)/…/(名称)

戰利品表[edit | edit source]

當一個生物死亡時,Minecraft根據戰利品表決定其掉落物。當首次開啟自然生成的容器(例如儲物箱)時,Minecraft也根據戰利品表生成其中的戰利品。可以透過/loot指令調用它們。

在命名空間資料夾中新建loot_tables資料夾以建立一個新的戰利品表。然後,在loot_tables(或其子資料夾)中新建戰利品表檔案战利品表名.json。在遊戲中,戰利品表以命名空間ID的格式引用。

作為參考,這裏給出的戰利品表的一個樣例:

 1 {
 2   "type": "minecraft:entity",
 3   "pools": [
 4     {
 5       "rolls": 1,
 6       "entries": [
 7         {
 8           "type": "minecraft:item",
 9           "functions": [
10             {
11               "function": "minecraft:set_count",
12               "count": {
13                 "min": 0,
14                 "max": 2,
15                 "type": "minecraft:uniform"
16               }
17             },
18             {
19               "function": "minecraft:looting_enchant",
20               "count": {
21                 "min": 0,
22                 "max": 1
23               }
24             }
25           ],
26           "name": "minecraft:leather"
27         }
28       ]
29     },
30     {
31       "rolls": 1,
32       "entries": [
33         {
34           "type": "minecraft:item",
35           "functions": [
36             {
37               "function": "minecraft:set_count",
38               "count": {
39                 "min": 1,
40                 "max": 3,
41                 "type": "minecraft:uniform"
42               }
43             },
44             {
45               "function": "minecraft:furnace_smelt",
46               "conditions": [
47                 {
48                   "condition": "minecraft:entity_properties",
49                   "predicate": {
50                     "flags": {
51                       "is_on_fire": true
52                     }
53                   },
54                   "entity": "this"
55                 }
56               ]
57             },
58             {
59               "function": "minecraft:looting_enchant",
60               "count": {
61                 "min": 0,
62                 "max": 1
63               }
64             }
65           ],
66           "name": "minecraft:beef"
67         }
68       ]
69     }
70   ]
71 }

如果您想要查找原版戰利品表,或是學習其中標籤的具體含義,請參見戰利品表

結構[edit | edit source]

結構可以用於結構方塊拼圖方塊,也可以覆蓋Minecraft中原版結構的外觀。結構以NBT格式存儲,您可以使用結構方塊建立NBT檔案。MCEdit之類的第三方軟件也可以導出NBT檔案。

在命名空間資料夾中建立structures資料夾以向資料包加入一個新的結構。然後,把你的NBT結構檔案放在structures資料夾(或它的子資料夾)之下。在遊戲中,結構以命名空間ID的格式引用。

進度[edit | edit source]

玩家透過完成進度來獲得獎勵。

在命名空間資料夾中建立advancements資料夾以建立一個新的進度。然後,在這個資料夾(或它的子資料夾)之下新建進度檔案 进度名.json。在遊戲中,進度以命名空間ID的格式引用。

配方[edit | edit source]

玩家根據配方合成熔煉物品。

在命名空間資料夾中建立recipes資料夾以建立一個新的配方。然後,在這個資料夾(或它的子資料夾)之下新建配方檔案 配方名.json。在遊戲中,配方以命名空間ID的格式引用。

有序配方[edit | edit source]

參見:配方§minecraft:crafting_shaped

第一種常見的配方類型是有序配方。

    {
        "type": "minecraft:crafting_shaped",
        "pattern": [
            "123",
            "231",
            "312"
        ],
        "key": {
            "1": {
                "item": "(物品命名空间ID)"
            },
            "2": {
                "item": "(物品命名空间ID)"
            },
            "3": {
                "item": "(物品命名空间ID)"
            }
        },
        "result": {
            "item": "(物品命名空间ID)",
            "count": 5
        }
    }

"type": "crafting_shaped"可以看出,這是一個有序配方。

pattern 是一個列表,描述了配方的形狀,最多包含3個字串。一個字串表示一橫行,每個字串最多含有3個字元,一個字元表示合成網格中的一個格子。字串不必非得是3個,每個字串也不一定要3個字元,但是每個字串中的字元個數必須是相等的。空格表示空格子。

key 是一個對象,規定了pattern中的字元所代表的物品。可以用item 後接物品ID,也可以用tag後接資料包標籤。

result 是一個對象,其中item規定了最終合成的是何種物品。count是一次合成成品的數量。

以下是活塞的原版合成配方,供參考:

    {
        "type": "crafting_shaped",
        "pattern": [
            "TTT",
            "#X#",
            "#R#"
        ],
        "key": {
            "R": {
                "item": "minecraft:redstone"
            },
            "#": {
                "item": "minecraft:cobblestone"
            },
            "T": {
                "tag": "minecraft:planks"
            },
            "X": {
                "item": "minecraft:iron_ingot"
            }
        },
        "result": {
            "item": "minecraft:piston"
        }
    }

無序配方[edit | edit source]

參見:配方§minecraft:crafting_shapeless

無序配方是另一種常見的配方類型。

    {
        "type": "crafting_shapeless",
        "ingredients": [
            {
                "item": "(物品命名空间ID)"
            },
            {
                "item": "(物品命名空间ID)"
            },
            [
                {
                    "item": "(物品命名空间ID)"
                },
                {
                    "item": "(物品命名空间ID)"
                }
            ]
        ],
        "result": {
            "item": "(物品命名空间ID)",
            "count": 5
        }
    }

"type": "crafting_shapeless"可以看出,這是一個無序配方。

無序配方沒有patterningredients是一個列表,列出合成所需的原料。原料可以以任何形狀排列在合成網格中。ingredients中如果出現列表,則表明該列表中的任何一種物品都可以使用,如下面火焰彈配方中,煤和木炭都可以使用。

以下是火焰彈的原版合成配方,供參考:

 1 {
 2   "type": "minecraft:crafting_shapeless",
 3   "ingredients": [
 4     {
 5       "item": "minecraft:gunpowder"
 6     },
 7     {
 8       "item": "minecraft:blaze_powder"
 9     },
10     [
11       {
12         "item": "minecraft:coal"
13       },
14       {
15         "item": "minecraft:charcoal"
16       }
17     ]
18   ],
19   "result": {
20     "item": "minecraft:fire_charge",
21     "count": 3
22   }
23 }

熔煉配方[edit | edit source]

也可自訂熔煉配方。

{
    "type": "smelting",
    "ingredient": {
        "item": "(物品命名空间ID)"
    },
    "result": "(物品命名空间ID)",
    "experience": 0.35,
    "cookingtime": 200
}

這是一個熔煉配方的大致示例。ingredient用於指定你要熔煉的物品。result將指定熔煉產品。在experience中,你可以選擇熔煉所獲得的經驗值,在cookingtime中,你可以選擇該物品熔煉所需的時間,在本例中為10秒(200刻=10秒)。

這是預設的鑽石礦熔煉配方:

{
    "type": "smelting",
    "ingredient": {
        "item": "minecraft:diamond_ore"
    },
    "result": "minecraft:diamond",
    "experience": 1,
    "cookingtime": 200
}

標籤[edit | edit source]

標籤用來對方塊物品實體函數分組。minecraft:tick函數標籤用來表示函數每遊戲刻都執行,minecraft:load 函數標籤則用來表示函數在每次世界載入(或重新載入)的時候都執行。

在命名空間資料夾之下新建tags資料夾以建立新的標籤。在這個資料夾之下,新建資料夾blocksitemsfunctions。然後,在任意一個資料夾(或它們的子資料夾)之下新建標籤檔案标签名.json。在遊戲中,標籤以命名空間ID的格式引用。

述詞[edit | edit source]

述詞(Predicate)是技術性JSON檔案, 相當於戰利品表/execute if predicate指令或谓词目標選擇器參數

在命名空間資料夾之下新建predicates資料夾以建立新的述詞。然後,在這個資料夾(或它的子資料夾)之下新建標籤檔案谓词名.json。在遊戲中,標籤以命名空間ID的格式引用。

維度[edit | edit source]

維度(Dimension)是JSON檔案,用於指定一個世界包含的所有維度。

維度的特殊之處在於它們只在minecraft命名空間中工作。在minecraft命名空間資料夾中建立一個維度資料夾以建立新的維度,然後建立一個名為维度名.json的檔案。建議將維度檔案放在與你的命名空間同名的單獨資料夾中:

minecraft:(命名空间)/维度名.json

自訂維度在遊戲中可使用/execute in minecraft:维度名訪問。

參見[edit | edit source]