# 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,直接點下去 ![image](https://hackmd.io/_uploads/H1O2cQkYyl.png) 2. 在裡面創建一個母資料夾(自行命名) ![image](https://hackmd.io/_uploads/SJMFi7ytkx.png) 3. 接著創建data做資料存放區,pack.mcmeta做系統辨識用(不常碰到) ```json= { #但務必要在pack.mcmeta中放入這串,當作辨識碼 "pack": { "pack_format": 48, "description": "我是介紹" } } ``` ![image](https://hackmd.io/_uploads/ByFUo71Ykl.png) 4. 進入data資料夾創建檔案(minecraft必備,其餘資料夾可自行創建) ![image](https://hackmd.io/_uploads/BJNq2IJF1g.png) --- ### 資料建置 #### 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 ![image](https://hackmd.io/_uploads/r190SiJKkx.png) - pvp_off.mcfunction ![image](https://hackmd.io/_uploads/SyExIj1YJe.png) - 先在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) :::