本教學介紹如何製作資料包。
入門[]
資料包允許玩家加入及修改函數、戰利品表、世界結構、進度、合成、標籤、維度和述詞等Minecraft遊戲內容。
禁止事項[]
在製作或發布資料包時,你不應該:
- 發布Minecraft版本或修改版,使得未從Mojang購買Minecraft的玩家可以獲得它。
- 以任何方式發布反編譯的Minecraft源代碼。
建立資料包[]
要建立資料包,請首先找到世界資料夾中的datapacks
資料夾。要查找世界資料夾,請在遊戲目錄(預設情況下為.minecraft)中找到saves
資料夾。
- 在單人遊戲中,你可以選中你的世界,點擊「編輯」,然後點擊「打開世界資料夾」。
- 在伺服器上,你可以打開其根目錄(server.properties所在的位置),然後打開
world
資料夾。
打開datapacks
資料夾後,建立一個資料夾並打開。資料夾名即是資料包名,可以任取,但不能含有漢字。
打開新資料夾後要做的第一件事是建立pack.mcmeta
檔案。這樣Minecraft才能識別該資料包。
建立pack.mcmeta檔案[]
在剛剛建立的資料夾裡新建一個名為pack.mcmeta
的純文字檔案。
- 注意
重新命名時,請確保檔案擴展名為.mcmeta
而非.txt
。也即,你可能要變更其擴展名。你可能會收到警告:如果改變檔案擴展名,可能會導致檔案不可用。這表明,你已正確重新命名pack.mcmeta
檔案。
如果你使用的是Microsoft Windows操作系統並且看不到檔案擴展名,對於Windows 11,可以在檔案資源管理器的「查看」→「顯示」選單中找到「檔案擴展名」選項並開啟;對於Windows 8、Windows 8.1或Windows 10,可以透過轉到其中的「查看」選單並勾選「檔案擴展名」核取方塊來啟用它。
對於其他Windows版本,可以取消勾選「資料夾選項」中的「隱藏已知檔案類型的擴展名」選項。
理論上任何文字編輯器都可以編輯pack.mcmeta,但建議文字編輯器支持JSON。JSON是mcmeta
檔案和資料包中大多數其他檔案使用的格式。大多數文字編輯器不會將mcmeta
擴展名識別為JSON文字。因此,你需要手動配置編輯器。
在你選擇的文字編輯器中打開pack.mcmeta
並粘貼或鍵入以下內容:
{
"pack": {
"pack_format": X,
"description": "教程数据包"
}
}
對於pack.mcmeta
,可在資料包的描述和名稱中使用「§」符號(Minecraft格式化代碼)。
你應該根據你的Minecraft版本替換“pack_format”
後面的X
。
“pack_format”
需為:
- 1.13快照17w43a至17w47b為
3
- 1.13(17w48a)至1.14.4(19w46b)為
4
- 1.15(1.15-pre1)至1.16.1(1.16.2-pre3)為
5
- 1.16.2(1.16.2-rc1)至1.16.5(20w45a)為
6
- 1.17(20w46a)至1.17.1(1.18-exp7)為
7
- 1.18(21w37a)至1.18.1(22w07a)為
8
- 1.18.2(1.18.2-pre1至正式版)為
9
- 1.19(22w11a)至1.19.3為
10
- 1.19.4快照23w03a至23w05a為
11
- 1.19.4(23w06a至正式版)為
12
- 1.20快照23w12a至23w14a為
13
- 1.20快照23w16a至23w17a為
14
- 1.20(23w18a)至1.20.1為
15
- 1.20.2快照23w31a為
16
- 1.20.2快照23w32a至23w35a為
17
- 1.20.2(1.20.2-pre1至正式版)為
18
- 1.20.3(23w40a)及以上為
19
description可以使用字串或原始JSON文字。當你將滑鼠懸停在/datapack list
列出的資料包名或進入建立世界的資料包介面時,這段內容將會顯示。
- 注意
這個檔案是用JSON編寫的!本教學沒有詳細介紹JSON格式,但要注意,不要忘記引號、冒號、圓括號和方括號。缺少任意一個都可能導致你的資料包無法正常工作!你可以使用JSON驗證器檢查你的檔案,例如JSONLint。
測試你的資料包[]
如果你建立了pack.mcmeta
,嘗試在遊戲中測試它。打開Minecraft,進入世界或輸入/reload
(如果你已經進入了世界),然後輸入/datapack list
。此時應該出現兩條資訊:第一條是[vanilla]
,第二條應該是[file/(你的数据包的名称)]
。當你將滑鼠懸停在資料包名稱上時,你應該會看到資料包的描述,即你在pack.mcmeta
的 description中所寫的內容。
故障排除[]
如果列表中沒有你的包,請確保pack.mcmeta
的語法正確且已儲存。看看有沒有缺少大括號{}
、逗號,
、冒號:
,雙引號""
,方括號[]
。請記住,對於每個左大括號、雙引號或方括號,必須有一個右大括號、雙引號或方括號與之配對。
命名[]
在資料包資料夾中建立一個名為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
。
合法字元[]
資料包中的命名空間、路徑、資料夾名和檔案名應僅包含以下符號:
0123456789
數字abcdefghijklmnopqrstuvwxyz
小寫字母_
下劃線-
連字號(減號)/
正斜槓(不能用於命名空間).
句號(不能用於命名空間)
首選命名格式為以下劃線隔開的小寫字母單詞(lower_case_with_underscores
),稱為蛇形命名法(lower snake case)。
命名空間[]
遊戲中的大多數對象都有一個命名空間(namespace),以防止潛在的內容衝突或無意的覆蓋。
例如,如果有兩個資料包為Minecraft分別加入了一個新的小遊戲機制,並且兩者都有名為start
的函數。如果沒有命名空間,這兩個函數就會衝突,小遊戲也會被破壞。但如果它們分別有game_1
和game_2
兩個不同的命名空間,則函數名分別為game_1:start
和game_2:start
,就不會衝突了。
大多數情況下Minecraft的命名空間ID需要命名空間的存在,如/function
指令,路徑和命名空間缺一不可。若命名空間未指定,則預設其為minecraft
。
新增內容時,請一定使用你自己的命名空間。僅當需要覆蓋其他東西,或追加標籤的時候,才使用其他命名空間。例如,遊戲本體使用minecraft
命名空間。僅當資料包需要覆蓋原版資料,或將內容加入到原版標籤時才會使用此命名空間。
函數[]
函數是一系列順次執行的指令。
要建立新函數,應在命名空间
資料夾中新建functions
資料夾。然後,在functions
(或其子資料夾)中新建函數檔案(函数名).mcfunction
,這就是你的函數檔案。你的函數會被遊戲命名為(命名空间):(函数名称)
,或者當位於子資料夾時為(命名空间):(子文件夹1)/(子文件夹2)/…/(名称)
。
一行指令需要單獨出現在一行,行首可以有若干空格或縮進。在函數檔案中,指令不以/
開頭。
作為分隔,你可以留下空白行。你也可以使用#
在行首以引起一段單行注釋。#
必須在一行的最前面,其前面不應有空格。
在實際執行函數時,空白行、注釋均會被忽略。
在遊戲規則sendCommandFeedBack
為true且每次以玩家的身份執行函數(玩家主動執行或透過/execute
)時,均會返回一行「已從函數 'example:test' 執行 x 個指令」。
戰利品表[]
當一個生物死亡時,Minecraft根據戰利品表決定其掉落物。當首次開啟自然生成的容器(例如儲物箱)時,Minecraft也根據戰利品表生成其中的戰利品。可以透過/loot
指令調用它們。
在命名空間資料夾中新建loot_tables
資料夾以建立一個新的戰利品表。然後,在loot_tables
(或其子資料夾)中新建戰利品表檔案战利品表名.json
。在遊戲中,戰利品表以命名空間ID的格式引用。
作為參考,這裡給出牛的戰利品表的一個樣例:
{
"type": "minecraft:entity",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 0.0,
"max": 2.0
},
"add": false
},
{
"function": "minecraft:looting_enchant",
"count": {
"type": "minecraft:uniform",
"min": 0.0,
"max": 1.0
}
}
],
"name": "minecraft:leather"
}
]
},
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:set_count",
"count": {
"type": "minecraft:uniform",
"min": 1.0,
"max": 3.0
},
"add": false
},
{
"function": "minecraft:furnace_smelt",
"conditions": [
{
"condition": "minecraft:entity_properties",
"predicate": {
"flags": {
"is_on_fire": true
}
},
"entity": "this"
}
]
},
{
"function": "minecraft:looting_enchant",
"count": {
"type": "minecraft:uniform",
"min": 0.0,
"max": 1.0
}
}
],
"name": "minecraft:beef"
}
]
}
]
}
如果你想要查找原版戰利品表,或是學習其中標籤的具體含義,請參見戰利品表。
結構[]
結構可以用於結構方塊或拼圖方塊,也可以覆蓋Minecraft中原版結構的外觀。結構以NBT格式儲存,你可以使用結構方塊建立NBT檔案。MCEdit之類的第三方軟件也可以匯出NBT檔案。
在命名空間資料夾中建立structures
資料夾以向資料包加入一個新的結構。然後,把你的NBT結構檔案放在structures
資料夾(或它的子資料夾)之下。在遊戲中,結構以命名空間ID的格式引用。
進度[]
玩家透過完成進度來獲得獎勵。
在命名空間資料夾中建立advancements
資料夾以建立一個新的進度。然後,在這個資料夾(或它的子資料夾)之下新建進度檔案 进度名.json
。在遊戲中,進度以命名空間ID的格式引用。
{
"parent": "namespace:example/advancement/root",
"display": {
"icon": {
"item": "minecraft:wooden_sword"
},
"title": "First blood",
"description": "to kill a monster.",
"announce_to_chat": true,
"show_toast": true,
"frame": "task"
},
"criteria": {
"first_kill_monster":{
"trigger":"player_killed_entity",
"conditions": {
"entity":{
"type":"#namespace:target",
"nbt": "{Tags:[\"change\"]}"
}
}
}
}
}
parent
鍵是可選的,它提供了該進度的上游進度,當該進度是根進度時無需此鍵。
display
鍵是可選的,它描述了該進度在進度介面(Esc點擊进度
按鈕打開,或直接在遊戲中按下L打開)的顯示方法。不填寫將不會顯示在進度介面。
criteria
鍵是必需的,它描述了該進度可能需要達成的條件。
除此之外,還有可選鍵requirements
、rewards
。
配方[]
在命名空間資料夾中建立recipes
資料夾以建立一個新的配方。然後,在這個資料夾(或它的子資料夾)之下新建配方檔案 配方名.json
。在遊戲中,配方以命名空間ID的格式引用。
有序配方[]
第一種常見的配方類型是有序配方。
{
"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": "minecraft: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"
}
}
無序配方[]
無序配方是另一種常見的配方類型。
{
"type": "crafting_shapeless",
"ingredients": [
{
"item": "(物品命名空间ID)"
},
{
"item": "(物品命名空间ID)"
},
[
{
"item": "(物品命名空间ID)"
},
{
"item": "(物品命名空间ID)"
}
]
],
"result": {
"item": "(物品命名空间ID)",
"count": 5
}
}
由"type": "crafting_shapeless"
可以看出,這是一個無序配方。
無序配方沒有pattern
。ingredients
是一個列表,列出合成所需的原料。原料可以以任何形狀排列在合成網格中。ingredients
中如果出現列表,則表明該列表中的任何一種物品都可以使用,如下面火焰彈配方中,煤和木炭都可以使用。
以下是火焰彈的原版合成配方,供參考:
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{
"item": "minecraft:gunpowder"
},
{
"item": "minecraft:blaze_powder"
},
[
{
"item": "minecraft:coal"
},
{
"item": "minecraft:charcoal"
}
]
],
"result": {
"item": "minecraft:fire_charge",
"count": 3
}
}
熔煉配方[]
也可自訂熔煉配方。
{
"type": "(smelting、blasting和smoking之一,分别对应熔炉、高炉和烟熏炉的烧炼配方)",
"category": "(配方所属的类别)",
"ingredient": {
"item": "(物品命名空间ID)"
},
"result": "(物品命名空间ID)",
"experience": 0.35,
"cookingtime": 200
}
這是一個熔煉配方的大致示例。
category
用於指定該配方在配方手冊中所屬的類別,可選值為blocks
、food
和misc
。ingredient
用於指定你要熔煉的物品。result
將指定熔煉產品。在experience
中,你可以選擇熔煉所獲得的經驗值,在cookingtime
中,你可以選擇該物品熔煉所需的時間,在本例中為10秒(200刻=10秒)。如果經驗值有小數部分,則表示有小數部分的機率獲得額外的1經驗值。如上例,0.35表示有35%機率獲得1經驗值,剩下65%不獲得。
這是預設的鑽石礦熔煉配方:
{
"type": "minecraft:smelting",
"category":"misc",
"group": "diamond",
"ingredient": {
"item": "minecraft:diamond_ore"
},
"result": "minecraft:diamond",
"experience": 1.0,
"cookingtime": 200
}
標籤[]
標籤用來對方塊、物品、實體和函數分組。minecraft:tick
函數標籤用來表示函數每遊戲刻都執行,minecraft:load
函數標籤則用來表示函數在每次世界載入(或重新載入)的時候都執行。
在命名空間資料夾之下新建tags
資料夾以建立新的標籤。在這個資料夾之下,新建資料夾blocks
、items
和functions
。然後,在任意一個資料夾(或它們的子資料夾)之下新建標籤檔案标签名.json
。在遊戲中,標籤以命名空間ID的格式引用。
述詞[]
戰利品表述詞(Predicate)是技術性JSON檔案,被用作戰利品表、指令/execute if predicate
和predicate
目標選擇器參數的條件。
在命名空間資料夾之下新建predicates
資料夾以建立新的述詞。然後,在這個資料夾(或它的子資料夾)之下新建標籤檔案谓词名.json
。在遊戲中,標籤以命名空間ID的格式引用。
生態域[]
主條目:自訂生態域
生態域(Biome)是JSON檔案,用於指定一個世界包含的所有生態域。他允許你為世界新增的生態域(註:正常世界中將不會出現新增的生態域,可以使用WorldEdit或新增維度或指令/fillbiome的方法加入)
生態域檔案儲存在資料包中的/data/(命名空间)/worldgen/biome
路徑的JSON檔案中
在命名空間資料夾內建立一個名為worldgen的資料夾,再在其中建立一個名為biome的檔案,之後在其中建立一個名為群系名.json
的檔案。檔案格式詳見自訂生態域
維度[]
維度(Dimension)是JSON檔案,用於指定一個世界包含的所有維度。
維度的特殊之處在於它們只在minecraft
命名空間中工作。在minecraft
命名空間資料夾中建立一個維度資料夾以建立新的維度,然後建立一個名為维度名.json
的檔案。建議將維度檔案放在與你的命名空間同名的單獨資料夾中:
minecraft:(命名空间)/维度名.json
。
自訂維度在遊戲中可使用/execute in minecraft:维度名
訪問。
維度類型[]
維度類型(Dimension Type)是JSON檔案,用於自訂一個新的維度類型。
透過它,你可以自訂在一個維度中的環境光照、高度限制等。它需要放在data/<命名空间>/dimension_type/<维度类型名称>.json
中。
自訂維度可以使用自定的維度類型,調整自訂維度的type
鍵即可。
參見[]
實例[]
組件 |
| ||
---|---|---|---|
資料包 | |||
教學 |
|
語言