閃亮亮華麗麗第十一期精華文章投票始動【19.07.26-19.08.26】 
LV. 23
GP 358

【教學】文字訊息json格式化教學 (3/25新增2樓 介紹其他標籤)

樓主 最討厭的傑 mark53682
GP9 BP-
發這篇文章起因算是興起
因為之前周圍朋友他想製作地圖卻遇到一些困難
我就花了一些時間找資料
可是好像我用的關鍵字都找不到中文說明
所以就想辦法google出英文wiki的相關教學來研究
不過我不確定是不是還有沒有更多是我沒找到的東西在
---以下正文---


說明前我先隨便舉一個範例 以範例來邊解釋邊教學
範例內容 : 在告示板第2行輸入 測試文字
(前面粗體深藍色 後面紅色沒其他)

首先要將不同格式的字各自分開來分別輸入格式

我們得用 "格式名稱":"數據" 來讓遊戲知道內容是什麼
格式有很多可以用 基本上可簽署的書能用的格式全部都可以拿來用
在這邊介紹的參考資料來自英文的minecraft wiki formatting code頁面

格式名稱 說明
text 要讓告示板輸出的文字
color 文字顏色 顏色名稱使用英文
bold 粗體字
underline 底線
strikethrough 刪除線
italic 斜體字
obfuscated 亂碼文字 注意它只支援半形


格式名稱的開頭皆不需大寫
除了text跟color後面的數據比較不同以外
其餘的只需要使用true(是)跟false(否)即可
還有一點是 順序不影響實際效果
不過避免難以閱讀 各位可以以自己習慣方式來排順序

怕有人不清楚顏色名稱
這邊就順便附上

顏色
英文名稱
黑色
black
深藍色
dark_blue
深綠色
dark_green
青色
dark_aqua
暗紅色
dark_red
深紫色
dark_purple
金色
gold
淺灰色
gray
灰色
dark_gray
藍色
blue
綠色
green
天藍色
aqua
紅色
red
亮紫色
light_purple
黃色
yellow
白色
white


上面的範例是用粗體/深藍色字表示測試   紅色字表示文字
排好就會像這樣
測試  ->  {"text":"測試","color":"dark_blue","bold":"true"}
文字  ->  {"text":"文字","color":"red"}

每個格式請記得要用,來隔開
{ } 表示這些效果是一組的
因為是同一行文字 所以連在一起之後要使用 [ ] 包起來 並且還是記得中間以,隔開
[{"text":"測試","color":"dark_blue","bold":"true"},{"text":"文字","color":"red"}]

下一步是在這裡的所有 " 前面都必須要加入 \ 跳脫字元 否則遊戲會無法分析
完成之後會像下面這樣 ((前面一步一步慢慢來是到這邊之後會開始不好閱讀
[{\"text\":\"測試\",\"color\":\"dark_blue\",\"bold\":\"true\"},{\"text\":\"文字\",\"color\":\"red\"}]

接下來就是一般告示板的輸入法
使用{Text#:"訊息"} 來告訴系統我該將文字放置在告示板第幾行
範例為第二行 所以就是
{Text2:"[{\"text\":\"測試\",\"color\":\"dark_blue\",\"bold\":\"true\"},{\"text\":\"文字\",\"color\":\"red\"}]"}

到此文字訊息的格式化已經算完成 不過其實還隱藏一個問題在裡面要在放出來之後才會發現
下圖是以現在這樣直接呼叫之後的內容



會發現後面兩個字也變粗體了
這是系統沒有把前面的格式取消
所以變成是要自己在後面手動取消 所以我還得在後面兩個字的格式加入,\"bold\":\"false\" (取消粗體)
修正之後的內容是
{Text2:"[{\"text\":\"測試\",\"color\":\"dark_blue\",\"bold\":\"true\"},{\"text\":\"文字\",\"color\":\"red\",\"bold\":\"false\"}]"}
這樣就OK了



接下來可以使用give指令或者setblock兩種方式其中一種來設置告示板
以下兩種我都會說明 不過我會建議用give指令會比較簡單

先說明give指令
在1.8的時候 NBT tag有新增一個標籤叫作BlockEntityTag
這個標籤的作用就是在手上的物品上儲存一個資料標記
而這個資料標記會跟著你手上的方塊放置在地上時一起被設置在地上
該標籤的使用方式是 BlockEntityTag:{標籤名稱:"標籤數據"}
跟上面的指令合併起來是
{BlockEntityTag:{Text2:"[{\"text\":\"測試\",\"color\":\"dark_blue\",\"bold\":\"true\"},{\"text\":\"文字\",\"color\":\"red\",\"bold\":\"false\"}]"}}

我們要呼叫一塊告示板(物品名稱sign)在手上 然後他沒有資料值
整個指令合在一起之後變成  (@p是給最靠近的玩家)
/give @p sign 1 0 {BlockEntityTag:{Text2:"[{\"text\":\"測試\",\"color\":\"dark_blue\",\"bold\":\"true\"},{\"text\":\"文字\",\"color\":\"red\",\"bold\":\"false\"}]"}}


如果是以setblock來呼叫的話
指令則需知道幾樣物品
先看這指令的使用法
/setblock <x> <y> <z> <方塊名稱> [方塊附加值] [原始方塊處理] [附加資料標籤]

一般不需附加資料標籤時候 前面附加值跟原始方塊處理都可省略
但是要標籤就必須前面都得輸入

第一個是方塊名稱 我們要用的不是只有單純sign
我們必須要告訴遊戲 是要放置
站著的告示板(standing_sign) 還是貼在牆壁的告示板(wall_sign)

第二個是方塊附加值 在這邊指的是面向的方向
站著的告示板總共有16方向(0~15)可以設置
0是文字面向遊戲南方 (我們面向北) 順著時鐘的方向旋轉(由上往下看)

貼在牆上的告示板則只有4個方向 可是不是0~3而是 2~5
以告示板上字的面向為準分別是
2北 3南 4西 5東
以玩家面向為準則是
2南 3北 4東 5西

第三個是原始方塊處理
常用的就2種方式
keep設置 replace取代
前者在目標座標有方塊卡住時候指令會呼叫失敗 後者就不管有沒有

座標部份1.8版的F3介面有個方便的功能是當你滑鼠指到了1個方塊的時候
在最底下會出現一條looking at
這個就是你滑鼠指向的那顆方塊座標點
所以可以利用它來確認你的告示板要放在哪
第二種選擇則是用 ~ 這符號代表當前座標
有XYZ 3個座標都用~的話會覆蓋掉指令方塊本身
((除非前面是用keep 這時候會顯示無法設置方塊
另外如果是輸入 ~1
這則是代表以當前座標為基準+1

指令打完樣子大概像下面這樣
假設告示板貼牆 字的面向朝東 我要把告示板設置在指令方塊的上面一格 整體指令如下
/setblock ~ ~1 ~ wall_sign 5 keep {Text2:"[{\"text\":\"測試\",\"color\":\"dark_blue\",\"bold\":\"true\"},{\"text\":\"文字\",\"color\":\"red\",\"bold\":\"false\"}]"}

這些指令必須要使用指令方塊呼叫才能完成
直接輸入在對話上會因為長度太長而後面都被截斷

最後的完成品就如下圖


9
-
LV. 23
GP 364
2 樓 最討厭的傑 mark53682
GP6 BP-

經由主樓底下留言提供 我後來又去多查了一些資料
最後我覺得應該要修改標題為 文字訊息json格式化教學 才正確
主樓內容就不作更動了  我把主樓內容當成是json格式化編寫教程
而此樓則是minecraft提供的json格式化可用標籤之介紹
這個東西適用的範圍有 告示板 /tellraw指令 /title指令 已簽署的書 4種
附帶一提 tellraw指令用來替代say指令 say指令不具有格式化的功能 tellraw才可以

然後下面正文將介紹 minecraft使用json格式化文字訊息可以擁有什麼功能

----------------------

我將一一把可使用的功能列出來 後面會用中文稍微解釋一下
((部分內容因為功能不清楚故只有單純提出並沒作解釋
另外  以下內容參考的資料為德國minecraft wiki JSON-Text頁面
我是google翻譯+自己旁邊開著minecraft做實驗 東西沒有說的很完整
如果有懂德文的朋友可以幫忙糾錯或者補充 ((是說這頁面好像只有德文版?..


一組文字訊息的屬性可以包含底下這些 我以條列式介紹 並以縮排分細項
  • 主訊息屬性 : text 文字, translate 翻譯, selector , score (4項功能不能共存)
    1. text 一般最常使用的屬性 使用方法 text:"文字訊息"
    2. translate 此屬性需搭配遊戲內部的語文文件檔使用
        呼叫相關關鍵字的字串可以讓系統依照你minecraft選擇的語系自動使用對應文字
        格式 translate:關鍵字位址
        例子 chat.type.achievement 是 獲得成就 的字串位址 假設指令如下
        /tellraw @p {translate:chat.type.achievement,with:["玩家","伐伐伐伐伐木工"]}
        在繁體中文 日本語 跟English(UK)下輸出的結果為
        
    3. selector 選擇 此屬性擁有可以讓玩家使用@p @a之類來將玩家名稱輸出進對話內的效果
        不過因為此標籤跟text等其他幾種標籤同時存在
        所以必須藉由extra標籤將此標籤包覆起來
        格式 selector:"@"
        例子 selector:"@p"
        /tellraw @a {text:"歡迎, ",extra:[{selector:"@p"}]}
        輸出結果:
        
  • color 顏色
      遊戲的文字共有16種顏色可提供給玩家使用
      可使用的顏色就不再多述 請自行參考主樓
      格式  color:"顏色名稱"
  • bold 粗體
  • italic 斜體
  • underlined 底線
  • strikethrough 刪除線
  • obfuscated 亂碼文字
  • hoverEvent 鼠標懸停事件
      滑鼠移動到該字串的時候 旁邊會跳出的小框框
      ((註:此屬性無法使用在告示板 以及title指令
    action : 動作
    1. show_text 顯示文字
    2. show_item 顯示道具資訊
    3. show_entity
    4. show_achievement 顯示成就
    value : 數值 ((依據上面給予的動作提供對應數值給他
    1. 使用text只需直接輸入文字即可
        格式為 hoverEvent:{action:show_text,value:"顯示內容"}
    2. 使用item則需給予一個道具ID
        最簡單格式可直接只輸入hoverEvent:{action:show_item,value:"{id:物品ID}"}
        加深複雜度也可以在value內加入其他標籤(Tag)
        例子 hoverEvent:{action:show_item,value:"{id:wooden_axe,tag:{display:{Name:\"伐木工之斧\",Lore:[\"伐木工的好幫手\"]}}}"} 會顯示
        
        (請記得這只是在對話欄上的文字顯示而已
        實際的物品還是要記得用give呼叫一次)
    3. entity 原文沒寫功能說明以及使用法 跳過不說明
    4. 使用achievement 是顯示遊戲內建的成就
        (如果知道模組成就的字串 也能呼叫該成就)
        格式hoverEvent:{action:show_achievement,value:"成就字串"}
        例子hoverEvent:{action:show_achievement,value:"achievement.diamonds"}
        滑鼠移到上方時會看到 鑽石! 成就
        
  • clickEvent 點擊事件
      當具有此屬性的時候 滑鼠點擊具有此屬性的字串
      將可以進行相對應的動作
      此屬性無法使用在 title指令上
    action : 動作
    1. run_command 執行指定指令
    2. suggest_command 自動完成文字
    3. open_url 開啟網頁
    4. change_page 已簽署的書內頁翻頁
    value : 數值
    1. 使用run_command 需給予一組指令讓系統執行
        如果給予的內容不是指令或者輸入有誤則無效果
        格式 clickEvent:{action:run_command,value:"/指令"}
        例子 clickEvent:{action:run_command,value:"/difficulty 0"}
        /tellraw @p {text:"點我切換遊戲難度到困難",clickEvent:{action:run_command,value:"/difficulty 3"}}
        指令效果:點擊畫面上對話可以將遊戲難度切換至困難
    2. 使用suggest_command 可給予任意內容 包括指令或者任何文字
        當點擊此文字的時候就會將你預設的內容自動輸入到打字欄位上
        你可以選擇是否自行按Enter打出去
        注意 打字欄位上有長度限制 應控制好你輸入的文字長度
        格式 clickEvent:{action:suggest_command,value:"文字訊息"}
        例子 clickEvent:{action:suggest_command,value:"氣球男孩 : Hello"}
        /tellraw @p {text:"點我顯示文字",clickEvent:{action:suggest_command,value:"氣球男孩 : Hello"}}
        指令效果:點擊後 打字欄位出現 "氣球男孩 : Hello" 字樣
    3. 使用open_url 可以給予一個網址
        玩家點擊字串的時候會出現詢問是否開啟網頁的選項
        字串不強迫輸入網址 可以輸入任何訊息
        格式 clickEvent:{action:open_url,value:"網址"}
        例子 clickEvent:{action:open_url,value:"https://minecraft.net/"}
        /tellraw @p {text:"點我開啟minecraft官方網站",clickEvent:{action:open_url,value:"https://minecraft.net/"}}
        指令效果:點擊後開啟minecraft官網
    4. change_page 這屬性是專門用於已簽署的書上的
        功能是你可以在書內的文字上點擊
        他會跳至你指定的頁數上
        可是該頁數必須是這本書內有的頁數才能跳
        如果不到那個頁數點擊就不會有反應
        當然 還是能一頁一頁手動翻頁
      格式 clickEvent:{action:change_page,value:頁數}
      例子 clickEvent:{action:change_page,value:5} 跳至第5頁
      /give @a minecraft:written_book 1 0 {title:"",author:"",pages:[
      "[{text:\"第一夜\n\n\n\n\n\n\n\n\n\n\n\n\n\"},{text:\"點我跳至第五夜\",clickEvent:{action:change_page,value:5}}]","第二夜","第三夜","第四夜",
      "{text:\"第五夜\n\n做的好, sport!\n(下週再見)\n你已獲得120美金支票\nTHE END\"}",
      "第六夜","{text:\"第七夜\n\n解雇通知\n(你被開除了!)\n原因:任意竄改玩偶的程式\n以及嚴重的體臭\"}"
      ]}
      指令效果:點擊文字後會跳到書的第5頁
  • insertion : 插入訊息
      此屬性跟點擊事件的suggest_command差別似乎在於
      前者直接用右鍵就好
      而此屬性必須要按住SHIFT不放再用"左"鍵點擊
      另外就是前者指令全部會更長一些 而這個可以很短
      效果都一樣是會在打字欄位上輸出你指定的文字
      還有沒有別的特殊用法有待提供
      格式 insertion:"文字訊息"
      例子 insertion:"氣球男孩 : Hi"
      /tellraw @a {text:"Shift+左鍵點我",insertion:"氣球男孩 Hi"}
      指令效果:Shift+左鍵點擊打字欄位輸出 "氣球男孩 Hi" 字樣
      
  • extra :
      此屬性主要用途好像是用於解決最上面text,translate,selector,score等4項屬性
      在同一組字串內不能一起使用的問題
      格式  extra:[{其他json資料}]
      例子最上面selector標籤就有了
      更新修正 -------- 此屬性後來我因為部分原因又做了一些測試
      他還可以讓你的整串指令達到一個排版的動作
      每一個{}內部的標籤都不會跟旁邊衝突
      所以可以達到 extra:[{text:"文字1"},{text:"文字2"},{text:"文字3"}] 的效果
      每一段都可以分別設定自己的格式
      此屬性的應用我認為是大量用在寫書跟輸出訊息到對話上
      需要讓你顯示的文字分開功能如果不使用它就沒辦法整合成一串指令


以上內容為我目前查到的資料
如有缺失可以請了解的玩家幫忙補充
我英文實在是完全不行 一切都是靠google翻譯機在幫忙的
6
-
未登入的勇者,要加入 3 樓的討論嗎?
板務人員:

1343 筆精華,昨天 更新
一個月內新增 3
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】