# Minecraft指令應用大全
[TOC]
## 簡介
**這裡是一些適用於做遊戲且特別的Minecraft指令
我將詳細介紹每個指令的用法**
==建議用電腦版觀看文檔==
⚠️**WARNING**
**指令前的符號代表:**
>🟪之符號為 ==重複指令方塊==
🟩之符號為 ==連鎖指令方塊==
🟧之符號為 ==脈衝指令方塊==
🖱️之符號為 ==預先創建的指令==
❗之符號代表 ==有條件==
沒有加❗代表 ==無條件==
若指令上下有這個 ---- 包圍住,代表其為一組相連指令方塊
以下指令通常是永遠啟動,若有需要紅石會註記
一般來說,較下行數的指令方塊會接著上面的指令方塊
‼️注意‼️
> 指令中常常加的TAG是為了==避免改動==到不相干實體
> 故在執行指令前,務必要先確認TAG是否添加
> 以下指令中有關Example或者EX都是範例文字,==請勿==直接使用,務必自行修改
建議參考文檔
> [Execute指令大全文檔](https://forum.gamer.com.tw/Co.php?bsn=18673&sn=1012435)
> [JSON格式用法大全](https://tw.alphacamp.co/blog/json)
🚫**此文檔有些部分較難理解純屬正常,因為要很熟悉指令功能,且大部分都是實例,因此對於指令參數運用要先有基礎的認知**
:::success
文檔目前擴展版本 ~ 1.21.4
:::
## 偵測指令 Execute 篇
### 盔甲座之NBT隨機取數
```mcfunction
🖱️ scoreboard players set random [objectives] 10
----
🟩❗summon armor_stand ~ ~ ~ {Invulnerable:1b,Tags:["Example"]}
🟩❗execute as @e[tag=Example,limit=1,sort=nearest] store result score @s[tag=Example] [objectives] run data get entity @s[tag=Example] UUID[0]
🟩❗scoreboard players operation @e[tag=Example,limit=1,sort=nearest] [objectives] %= random [objectives]
----
```
- 務必先預設一變數(==random==)的 `Objectives` 的分數為 ==10==,這樣就能 `mod` 運算啦~
- 指令前則根據需求設定條件來**啟動**隨機取數功能。
- 這指令很適合用來隨機取數,雖然有其他方法,但我比較喜歡這個。
- 語法中 `1b` 代表 `true`,`0b` 代表 `false`。
- 而語法利用實體生成時隨機附帶的 `UUID`(唯一識別碼),並取其中一部分 (`UUID[0]`) 作為隨機數
- 在operation中是用 `mod` 餘數法(%=),把 `UUID` 當作被除式,`random` 當除式,最後得到的就是 `UUID` 的末位(==因為除以10,得到的餘數就是末碼~==)
影片展示 :
<video src="https://i.imgur.com/wOPjpvS.mp4" controls width=100%></video>
---
### 計分板Scoreboard之計時器
```
🟪scoreboard players add [entities] [objectives] 1
🟪execute if score [entities] [objectives] matches 20.. run scoreboard players set [entities] [objectives] 0
```
- 這個指令很簡單,前面的 `entities` 是實體對應的 `Objectives` 計分板分數值。
- 第一行則是利用不斷加一(每 1 tick 加一),因為 ==Minecraft 中 20 ticks 等於 1 秒==,所以可以利用這個性質來實現計時功能。
---
### 漂浮於空中並旋轉的方塊
```mcfunction
🖱️or 🟧 summon minecraft:armor_stand ~ ~ ~ {
Tags: ["EX"],
CustomName: '{"text":"測試用","color":"gold"}',
Invisible: 1b,
CustomNameVisible: true,
ArmorItems: [
{},
{},
{},
{
Count: 1,
id: "minecraft:gold_block"
}
]
}
🟪execute as @e[type=minecraft:armor_stand,tag=EX] at @s run tp @s ~ ~ ~ ~5 ~
```
- 這個指令很有趣,玩過 Minecraft 的應該知道 Hypixel 伺服器,而他們床戰中的方塊漂浮旋轉效果,其實只要用上述兩條指令就能輕鬆做到!
- 第二個指令的 `as ... at` 是指定目標實體並用 `@s` 代替,所以後面 `run` 時可以直接用 `@s`,不用再輸入一堆條件啦~
- 前面三個 `~` 是實體的座標,我們不需要更改;而後面三個 `~` 代表旋轉(Rotation),用來控制水平與垂直軸,我們只需要改水平軸,所以在第四個 `~` 加上一個數字(旋轉量)就好啦~
- 第一行所附帶的NBT請自行到[Minecraft維基](https://minecraft.fandom.com/zh/wiki/%E5%AE%9E%E4%BD%93%E6%A0%BC%E5%BC%8F)查看~我這裡只放與遊戲相關的性質參數
影片展示 :
<video src="https://i.imgur.com/t5iYTog.mp4" controls width=100%></video>
---
### 偵測掉落物之觸發事件
```mcfunction
----
🟪 execute as @a[tag=Example,scores={ITEM_DROP=1..}] at @s if entity @e[type=item,nbt={Item:{id:"minecraft:..."}},distance=..3] run tp @e[type=item, nbt={Item:{id:"minecraft:..."}}] @s
🟩❗scoreboard players set @a[scores={ITEM_DROP=1
..}] ITEM_DROP 0
🟩❗kill @e[type=item, nbt={Item:{id:"minecraft:..."}}]
----
🟪 execute as @a[tag=Example,scores={ITEM_DROP=1..}] at @s if entity @e[type=item,nbt={Item:{id:"minecraft:..."}},distance=..1] run ...
```
- 這個指令的有趣之處在於,可以利用玩家丟出的物品來實現觸發功能。
- 記得將 `minecraft:...` 中的 `...` 替換成你想丟出的物品。
- 加上有條件的 `kill` 指令是為了避免實體不消失而持續觸發,但也為了防止還沒觸發就消失,所以必須設定「有條件」才能確保觸發後才會消失。
- `ITEM_DROP` 是自訂義的計分功能,示範 : `/scoreboard objectives add STICK_DROP minecraft.dropped:minecraft.stick`
---
### 偵測玩家人數並映射到計分板之便捷方法
```mcfunction
🟪 execute store result score 紅隊人數 [Objectives] run execute if entity @a[team=Red]
```
- 這是一個很便捷的方法去取得一特定群體之人數
- 這個指令也十分有趣,前面在於==儲存==,後面在於==檢測回傳==
- `store result` 顧名思義,儲存結果,這是一個很好用的方法
- 上面指令中的 `紅隊人數` 便是一個範例,其可將後面檢測到的@a[team=Red]之人數作為其值,這在很多遊戲中是必要的存在~
---
### 箱子商店購買功能
```mcfunction
🟪 execute unless block X Y Z minecraft:chest{
Items: [
{Slot: 15b, id: "minecraft:firework_rocket"}
]
} run item replace block X Y Z container.15 with minecraft:firework_rocket[
hide_additional_tooltip={}
] 1
```
- OK,我知道這部分有點複雜,但其實 `unless` 就是 `if` 的相反。當 `unless` 後面的方塊或實體違反條件(例如條件是 `tag=S`,偵測到實體的 `tag` 不為 `S` 時就是「違反」),就會執行指令。
- 當玩家 ==點擊(改動)== 箱子中的物品時,即視為 ==更改(違反)==。此時後面的 `run` 指令會接上 `item replace`(置換物品),以保持箱子內容固定。
- 接下來的動作,比如清除玩家拿下的商品、扣除購買金額等,就看你要怎麼設計啦~
- 在屬性中有時候會有 `attribute_modifiers` 出現,它比較特別,是用來定義物品的特殊屬性,這裡就不多述,請自行查找相關資料喔!
- 剩餘的屬性like : additional_tooltip、show_in_tooltip就是一般屬性,也可以在Minecraft wiki找到,這部分就不多述了~
---
## 資料指令 Data 篇 (微進階)
在進入Data之前,要先了解JSON的實際作用
在簡介上,我有提供一個JSON介紹網站,可以去查看!
而NBT也就是以**JSON格式做儲存**的,因此了解JSON格式對NBT編寫很有用喔!
### NBT介紹
在Minecraft中,==NBT可以儲存任何一切實體、方塊==等的任何資料
無論是**座標、狀態、性質**,都能夠儲存在NBT中
因此,學會NBT,你將可以創造許多有趣的東西!
而在其中會出現一個指令就是 ```/data```
顧名思義,它跟資料有關!
這個指令即可以對任何物體作更改,因此在做遊戲時,很常會用到它喔!
以下的功能介紹,我會以指令形式並搭配JSON格式來說明,相信你一定能夠看懂!
不過還是得說一下,這裡需要對字典跟列表有一些認知喔~
---
### 告示牌點擊觸發功能
```mcfunction
🖱️ setblock X Y Z minecraft:oak_sign{"front_text":{messages:['{"clickEvent":{"action":"run_command", "value":"/say hi"}, "text":"hi"}', '""', '""', '""']}}
```
``` json=
# 這裡是oak_sign後面接的NBT, 是不是就很清晰了~
{
"front_text": { #告示牌展示文字
"messages": [ #文字資料
'{
"clickEvent": { #點擊觸發事件宣告
"action": "run_command", #事件類型
"value": "/say hi" #事件內容
},
"text": "hi" #文字內容
}',
'""', #第二行資料
'""', #第三行資料
'""' #第四行資料
]
}
}
```
- 我們可以看到NBT就是一列一列的套筒,像俄羅斯娃娃一樣!
- 在每行的後面都有 # 作註解,相信你能夠get到!
- 這邊注重的不是字串,而是他們各自的格式,可以看到在列表[]裡面每個逗號間隔都利用==單引號作包含==,而二三四行做留空也必須要給予空字串及單引號做佔位,這樣才是預設的messages格式
- 若要觸發多個指令,可以在二三四行都加上clickEvent,再把text中間留空即可,亦或者利用function指令包(請看第三類別介紹),直接省下許多步驟
### Data資料修改
```json
🖱️ 或 🟧
setblock X Y Z minecraft:oak_sign{
"front_text": {
"messages": [
'{"clickEvent":{"action":"run_command", "value":"/tag add @a pvp_on"}, "text":"PVP模式:關閉"}',
'""',
'""',
'""'
]
}
}
🖱️ 或 🟧
data modify block X Y Z front_text.messages[0] set value '{
"clickEvent": {"action":"run_command","value":"/tag add @a pvp_off"},
"text":"PVP模式:開啟"
}'
```
- 這邊展示了點擊之後利用modify(更改)來修改資料
- 不過這裡的指令有bug,因為其實這樣點兩次之後,兩個tag都會有,一般來說會使用兩組指令方塊來做為 `開啟` 跟 `關閉`的設定,不過這樣會打太多,就請自行測試囉! (第三類有==function修飾完整版==,可以參考!)
- 這邊要講的是它的front_text.messages[0] 這個是一種==路徑==,在JSON格式中做為取值用,這個結構可以去參考上面的告示牌觸發的JSON碼
- 而在其中可以知道,在MC中,取{}是利用==小數點==,取[]內部之值是利用==數字代表項數==
- 這邊要注意的是 ' "clickEvent"... ' 外圍所包的單引號表示其內部為==字串==,故無法利用列表及字典之方式去取值,故才直接把clickEvent整串貼上來
---
### 利用Components之實體資料做儲存
```json
🖱️ 或 🟧
give @p minecraft:wooden_axe[
minecraft:custom_data={
"hint": "Oh! You found me"
}
]
```
- Components是實體NBT中不可或缺的一個要素,常被用來自定義一些東西
- 這裡示範的是藏一段訊息在斧頭Components中的custom_data,它不會顯示出來,因此是==絕佳的資料庫!==
- 當然,它也是JSON格式,因此在前面可以看到 = 便是在儲存我給予的JSON格式
- 如何查看? 可以利用/data get來做取得
- 舉例 : 在一款超強大的建築猜謎遊戲TBGD中,他們便是利用Custom_data將遊戲語言提示詞儲存在一個頭盔中,更換語系時,便利用data merge來做更改
---
## 打包指令 Function 篇
在Minecraft中,function是一個很有趣的東西,它省下了許多指令方塊的使用,在許多大型地圖製作中,是重要的存在
---
### 資料路徑前置
1. 在Minecraft地圖資料夾當中,找到datapacks,直接點下去

2. 在裡面創建一個母資料夾(自行命名)

3. 接著創建data做資料存放區,pack.mcmeta做系統辨識用(不常碰到)
```json=
{ #但務必要在pack.mcmeta中放入這串,當作辨識碼
"pack": {
"pack_format": 48,
"description": "我是介紹"
}
}
```

4. 進入data資料夾創建檔案(minecraft必備,其餘資料夾可自行創建)

---
### 資料建置
#### Tags標籤檔案
接下來的部分我用資料路徑來說明
請在minecraft資料夾中再創建以下的路徑檔案
`"minecraft\tags\function\load.json"`
`"minecraft\tags\function\tick.json"`
>`load.json` 指的是==初始加載==的指令包
`tick.json` 指的是==每刻(20刻=1秒)都執行一次==指定檔案
:::success
在編輯Json等類型檔案,盡量使用編譯器,若沒有編譯器,[請點我](https://hackmd.io/@sysprog/rJPKpohsx?type=view)
:::
兩個檔案中都要有以下這串東西
```json=
{
"values":[
"system:load" #你自己要執行的資料指令包,請自行更改
]
}
```
- minecraft在辨認data時,會找尋有無標籤檔案(即tags\function\...)
- 故這兩個檔案之名稱有其固定的命名空間(namespace),不能擅自更改
#### 自訂義mcfunction檔案
接著切回到自己創建的檔案(如:system)
進入system資料夾 -> 創建function資料夾(這也是固定的名稱)
-> 創建 `tick.mcfunction` & `load.mcfunction`
這兩個mcfunction就是拿來作為剛剛的json檔所指定的檔案(你可以指定其他的,這邊只是作範例用同樣名稱)
---
### 指令包運作
我們先試著利用function將告示牌觸發指令完善
- pvp_on.mcfunction

- pvp_off.mcfunction

- 先在system資料夾中創建 `pvp_on.mcfunction`、`pvp_off.mcfunction`
- 在裡面貼上圖片中的指令
影片展示 :
<video src="https://i.imgur.com/NKg7LeZ.mp4" controls width=100%></video>
---
:::info
⭐ 此檔案會持續擴展、追蹤最新版本,目前版本 : 1.21.4
📢 下一版本預告 : 1.21.5將更新文字字元格式,小幅調整JSON格式的運用
🏷️ 編輯者 : Rix
🖥️ 錯誤回報 : [點我聯絡編輯者](https://github.com/Remixfan0912)
:::