UU看書

第六十章 基岩版的JSON文字(破200收藏紀念)

天才一秒記住【UU看書】地址:www.uukanshu.co

JSON文字在Java版很常用。在基岩版雖然能用的地方少了很多,但仍然很有用處。

基岩版的JSON文字主要用於指令、書與筆的文字和告示牌的文字上。由於基岩版指令的限制,我們只能在tellraw和titleraw兩個指令中用到JSON文字。雖然能用的地方極其少,我們仍然得學習學習,就因為tellraw這條指令極其有用。

基岩版的JSON文字的基礎格式如下:

“rawtext“

在基岩版中,每串JSON文字的最外層必然是rawtext元件。rawtext的值是JSON物件列表,也就是由多個JSON物件組成的列表。你可以把JSON物件看作是NBT中的複合標籤(兩者其實沒多大差別),方便理解。

基岩版的JSON文字元件相比Java版要少許多。不算rawtext的話,基岩版一共只有五個元件:

內容元件

text(值:文字)

selector(值:文字)

translate(值:文字)

score(值:JSON物件,相當於NBT的複合標籤)

ranslate配套元件

with(值:由多個文字組成的列表)

最基礎的元件還是text,用法和Java版的一模一樣:

“rawtext““text““Hello“

這解析後會變成:Hello

你有沒有注意到,基岩版甚至連文字顏色格式元件都被閹割了,也就是說我們無法使用color元件來修改文字顏色。既然我們無法使用color之類的元件,那麼我們該如何修改文字的顏色和格式?

你是不是忘記了一個東西:§

由於基岩版可以自由使用§來修改文字的顏色和格式,因此Mojang就把color之類的文字顏色格式元件給切了。

在基岩版的JSON文字中使用§,需要注意兩點:

①§必須要放在內容元件的值中,不能放在元件名等其他地方。雖然放在其他地方在命令方塊中也會生效,但JSON文字就無法被遊戲正確識別並輸出了。

②使用§後記得要及時用§r來重置文字樣式,不然會把§右邊的所有文字都修改了樣式。比如:

“rawtext““text““§eHello“,“text““Minecraft“

這將會輸出:HelloMinecraft(都是黃色)

如果是“rawtext““text““§eHello§r“,“text““Minecraft“,則只會把“Hello”一段變成黃色。

selector元件可以輸出實體名稱,其值必須填的是目標選擇器。比如:

“rawtext““selector““p“

這將會輸出距離執行地點最近玩家的名稱。假設距離執行地點最近的玩家叫做『Phigros』,那麼這將會輸出:Phigros

selector的使用還是很簡單的。但請注意,你不能把selector當做text一樣使用。原因很簡單:其值必須是個目標選擇器。

如果你把selector當做text一樣用,比如這樣子填寫:

“rawtext““selector““HelloMinecraft“

你會驚奇地發現執行指令後,沒有任何的文字輸出,也沒有任何的報錯資訊。

這是為什麼呢?因為selector的值必須是個目標選擇器,你這樣填就相當於要輸出玩家HelloMinecraft的名稱,而遊戲中又沒有叫做HelloMinecraft的玩家,自然就不會輸出。但如果真的有一個叫做HelloMinecraft的玩家且線上,就會正常輸出『HelloMinecraft』。

translate元件是這五個元件中最難的一個,因為它有些涉及到Minecraft的模組、資源包開發。為何這麼說?因為translate元件可以讓一段文字以目標玩家的語言輸出。

在學習translate的用法之前,我們要了解一個東西:本地化鍵(也稱『翻譯識別符』)

每一種語言都有自己對應的語言檔案,比如美式英語對應的就是enuslang,中文簡體對應的就是zhcnlang。遊戲中同一個地方的文字會翻譯成不同的語言。這時候問題來了:我們該如何在不同的語言檔案中正確找到用於這個地方的文字呢?

這時候本地化鍵就出場了。

把一個地方的文字在不同語言中的翻譯都繫結到一串不變的ID上,根據ID找到對應的翻譯文字,不就解決這個問題了嗎?

舉個例子,在下面兩個不同的語言檔案中分別有這麼一行:

enuslang:

serverhelpgetgoldYoucangetgoldbysellingitemsandplayinggamesForexample,youmayget500coinsifyouwinagameofBedWar

zhcnlang:

serverhelpgetgold您可以透過售賣物品、玩小遊戲來獲得金幣。比如當你贏得一局起床戰爭時,您可能會獲得500枚金幣。

我們只需要在需要用到這一串文字的地方放上『serverhelpgetgold』,遊戲就會自動根據不同的語言將這一串本地化鍵替換成對應語言的文字。

JSON文字內的translate元件就是幹這行的。在translate的值內寫上本地化鍵,遊戲就會根據不同的語言將對應的內容呈現出來。比如:

“rawtext““translate““serverhelpgetgold“

如果你使用的是中文簡體,最終這將會輸出:『您可以透過售賣物品、玩小遊戲來獲得金幣。比如當您贏得一局起床戰爭時,你可能會獲得500枚金幣。』

如果你使用的是美式英語,這反而會輸出:『YoucangetgoldbysellingitemsandplayinggamesForexample,youmayget500coinsifyouwinagameofBedWar』

現在你明白了嗎?

(注:上面這個serverhelpgetgold本地化鍵是編的,但接下來的幾個本地化鍵都是真實存在於遊戲中的。)

translate的使用肯定沒有這麼簡單,這只是最基礎的用法而已。有時候,本地化鍵對應的文字內會有一些特殊的部分。比如『deathattackonFire』,如果你只是這麼用它:

“rawtext““translate““deathattackonFire“

最終它會輸出:

1s被燒死了

這是怎麼回事?因為我們沒有指定死亡的東西是什麼。如果我們要指定,就得用到translate的配套元件:with

with的值是由多個文字組成的列表。至於為什麼是個列表,是因為有些時候會有多個特殊的部分,這時候就需要使用列表來分別指定每個部分是什麼。

我們待會再研究具有多個特殊部分的情況。先來試試使用with指定死亡的東西是『張三』:

“rawtext““translate““deathattackonFire“,“with““張三“

這將會輸出:張三被燒死了

現在我們再來看看有多個特殊部分的情況:

“rawtext““translate““deathattackarrowitem“

這將會輸出:1s被2s用3s射殺

這句話雖然很短,但有三個特殊的部分。如何正確指定這三個特殊部分呢?按照從左到右的順序指定:

“rawtext““translate““deathattackarrowitem“,“with““枯藤“,“老樹“,“昏鴉“

這會輸出:枯藤被老樹用昏鴉射殺

一般情況下,特殊部分會按照從左到右的順序一一對應列表內的元素。在上面的例子中,1s最靠左,“枯藤”也在列表的最左邊,因此1s就被“枯藤”替換了。剩下的2s和3s同理。

這就是translate元件一般的用法。除了這個用法外,translate還能被當做text元件一樣用,且比text元件多出了一個沒啥用的功能:自定義特殊部分

特殊部分有兩種自定義的格式:

s

(為列表內元素從左到右排列的序號)

先來說說s。s的用法和上面的1s、2s之類的一模一樣,都是從左到右一一對應。比如:

“rawtext““translate““你好s!這裡有一些關於s的說明。“,“with““新手“,“空島戰爭“

這會輸出:你好新手!這裡有一些關於空島戰爭的說明。

的功能和s比較不一樣。的實際上是列表內各個元素從左到右的排列數字。比如1在上面的列表中就代表著『新手』。也就是說,如果這樣子填寫:

“rawtext““translate““你好1!這裡有一些關於1的說明。“,“with““新手“,“空島戰爭“

最終會輸出:你好新手!這裡有一些關於新手的說明。

上面的例子中,s和都是獨立使用。如果兩者一起使用會發生什麼呢?

來看看下面這個例子:

“rawtext““translate““歡迎來到s,1!您今日的s還未領取!“,“with““EaseCation“,“每日簽到獎勵“,“一個普通的路人“

猜一猜,最終這會輸出什麼?

你是不是以為,最終這會輸出:歡迎來到EaseCation,EaseCation!您今日的每日簽到獎勵還未領取!

如果你這樣想,就錯了。實際上輸出的是:歡迎來到EaseCation,一個普通的路人!您今日的每日簽到獎勵還未領取!

這是怎麼一回事?當s和一起使用的時候,遊戲會優先把s替換掉。按照從左到右的原則,第一個s被替換成了『EaseCation』,第二個s被替換成了『每日簽到獎勵』。然後遊戲才會替換。這時候神奇的地方來了,由於s使用過的列表元素就不能再使用,因此的順序得從第三個元素開始算起,最終導致1被替換成了『一個普通的路人』。

這就是translate和其配套with元件的全部內容,你學會了嗎?

最後的score元件簡單且有用,它可以顯示記分板上的分數。

score的值是JSON物件,你可以把它當做是複合標籤。物件內有三個子元件:

name——選擇正在被記分板追蹤的目標,顯示ta的分數,值為文字。必須填寫目標選擇器或玩家名(假的也可以)。

objective——計分項名稱。值為文字。

value可選——值為文字。如果指定了該項,不管真實的分數是多少,都會顯示為該項的值。

(注:作者實驗時發現value元件沒用,可能在目前的基岩版最新版中已經刪去了該標籤。作者實驗的版本是基岩版1182)

舉個例子。假設玩家Liben在計分項Primogems上的分數為2431,我們可以這樣輸出他的分數:

“rawtext““score““name““Liben“,“objective““Primogems“

這將會輸出:2431

需要注意,當name選定的目標為多個時,遊戲將會按照目標選擇器排列的順序輸出每個目標的分數。

現在你會使用基岩版的JSON文字了嗎?注意,一個JSON物件內不能有多個內容元件。當一個物件內有多個內容元件時,權重高的元件的內容將會覆蓋權重低的元件。四個內容元件的權重如下:

scoreltselectorlttextlttranslate

(注:該權重為作者實驗得出)

這就是基岩版JSON文字的全部內容了。

如遇章節錯誤,請點選報錯(無需登陸)

新書推薦

全民遠征:副職也能帶贏全人類 傳奇幽影 惡魔系統之坑坑更有愛 訓練嗎朋友,玩命的那種 方舟日記 林夕煜宸妖夫在上免費閱讀全文 無限入侵,一人一刀滅一界