首頁 游戲

Minecraft指令手冊

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

Minecraft指令手冊 你好MC 1453 2020-02-02 16:10:17

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

  基巖版的JSON文本主要用于指令、書與筆的文本和告示牌的文本上。由于基巖版指令的限制,我們只能在/tellraw和/titleraw兩個指令中用到JSON文本。雖然能用的地方極其少,我們?nèi)匀坏脤W習學習,就因為/tellraw這條指令極其有用。

  基巖版的JSON文本的基礎格式如下:

  {“rawtext“:[]}

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

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

  \\內(nèi)容組件\\

  text(值:文本)

  selector(值:文本)

  translate(值:文本)

  score(值:JSON對象,相當于NBT的復合標簽)

  \ranslate配套組件\\

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

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

  {“rawtext“:[{“text“:“Hello!“}]}

  這解析后會變成:Hello!

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

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

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

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

 ?、佟毂仨氁旁趦?nèi)容組件的值中,不能放在組件名等其他地方。雖然放在其他地方在命令方塊中也會生效,但JSON文本就無法被游戲正確識別并輸出了。

 ?、谑褂谩旌笥浀靡皶r用§r來重置文字樣式,不然會把§右邊的所有文本都修改了樣式。比如:

  {“rawtext“:[{“text“:“§eHello!“},{“text“:“Minecraft“}]}

  這將會輸出:Hello!Minecraft(都是黃色)

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

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

  {“rawtext“:[{“selector“:“@p“}]}

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

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

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

  {“rawtext“:[{“selector“:“HelloMinecraft“}]}

  你會驚奇地發(fā)現(xiàn)執(zhí)行指令后,沒有任何的文本輸出,也沒有任何的報錯信息。

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

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

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

  每一種語言都有自己對應的語言文件,比如美式英語對應的就是en_us.lang,中文簡體對應的就是zh_cn.lang。游戲中同一個地方的文本會翻譯成不同的語言。這時候問題來了:我們該如何在不同的語言文件中正確找到用于這個地方的文本呢?

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

  把一個地方的文本在不同語言中的翻譯都綁定到一串不變的ID上,根據(jù)ID找到對應的翻譯文本,不就解決這個問題了嗎?

  舉個例子,在下面兩個不同的語言文件中分別有這么一行:

  en_us.lang:

  server.help.getgold=You can get gold by selling items and playing games.For example, you may get 500 coins if you win a game of Bed War.#

  zh_cn.lang:

  server.help.getgold=您可以通過售賣物品、玩小游戲來獲得金幣。比如當你贏得一局起床戰(zhàn)爭時,您可能會獲得500枚金幣。#

  我們只需要在需要用到這一串文本的地方放上『server.help.getgold』,游戲就會自動根據(jù)不同的語言將這一串本地化鍵替換成對應語言的文本。

  JSON文本內(nèi)的translate組件就是干這行的。在translate的值內(nèi)寫上本地化鍵,游戲就會根據(jù)不同的語言將對應的內(nèi)容呈現(xiàn)出來。比如:

  {“rawtext“:[{“translate“:“server.help.getgold“}]}

  如果你使用的是中文簡體,最終這將會輸出:『您可以通過售賣物品、玩小游戲來獲得金幣。比如當您贏得一局起床戰(zhàn)爭時,你可能會獲得500枚金幣?!?p>  如果你使用的是美式英語,這反而會輸出:『You can get gold by selling items and playing games.For example, you may get 500 coins if you win a game of Bed War.』

  現(xiàn)在你明白了嗎?

  (注:上面這個server.help.getgold本地化鍵是編的,但接下來的幾個本地化鍵都是真實存在于游戲中的。)

  translate的使用肯定沒有這么簡單,這只是最基礎的用法而已。有時候,本地化鍵對應的文本內(nèi)會有一些特殊的部分。比如『death.attack.onFire』,如果你只是這么用它:

  {“rawtext“:[{“translate“:“death.attack.onFire“}]}

  最終它會輸出:

  %1$s 被燒死了

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

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

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

  {“rawtext“:[{“translate“:“death.attack.onFire“,“with“:[“張三“]}]}

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

  現(xiàn)在我們再來看看有多個特殊部分的情況:

  {“rawtext“:[{“translate“:“death.attack.arrow.item“}]}

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

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

  {“rawtext“:[{“translate“:“death.attack.arrow.item“,“with“:[“枯藤“,“老樹“,“昏鴉“]}]}

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

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

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

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

  %%s

  %%#(#為列表內(nèi)元素從左到右排列的序號)

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

  {“rawtext“:[{“translate“:“你好%%s!這里有一些關于%%s的說明。“,“with“:[“新手“,“空島戰(zhàn)爭“]}]}

  這會輸出:你好新手!這里有一些關于空島戰(zhàn)爭的說明。

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

  {“rawtext“:[{“translate“:“你好%%1!這里有一些關于%%1的說明。“,“with“:[“新手“,“空島戰(zhàn)爭“]}]}

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

  上面的例子中,%%s和%%#都是獨立使用。如果兩者一起使用會發(fā)生什么呢?

  來看看下面這個例子:

  {“rawtext“:[{“translate“:“歡迎來到%%s,%%1!您今日的%%s還未領?。 ?,“with“:[“EaseCation“,“每日簽到獎勵“,“一個普通的路人“]}]}

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

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

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

  這就是translate和其配套with組件的全部內(nèi)容,你學會了嗎?

  最后的score組件簡單且有用,它可以顯示記分板上的分數(shù)。

  score的值是JSON對象,你可以把它當做是復合標簽。對象內(nèi)有三個子組件:

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

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

  value[可選]——值為文本。如果指定了該項,不管真實的分數(shù)是多少,都會顯示為該項的值。

 ?。ㄗⅲ鹤髡邔嶒灂r發(fā)現(xiàn)value組件沒用,可能在目前的基巖版最新版中已經(jīng)刪去了該標簽。作者實驗的版本是基巖版1.18.2)

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

  {“rawtext“:[{“score“:{“name“:“Liben“,“objective“:“Primogems“}}]}

  這將會輸出:2431

  需要注意,當name選定的目標為多個時,游戲?qū)凑漳繕诉x擇器排列的順序輸出每個目標的分數(shù)。

  現(xiàn)在你會使用基巖版的JSON文本了嗎?注意,一個JSON對象內(nèi)不能有多個內(nèi)容組件。當一個對象內(nèi)有多個內(nèi)容組件時,權重高的組件的內(nèi)容將會覆蓋權重低的組件。四個內(nèi)容組件的權重如下:

  score<selector<text<translate

 ?。ㄗⅲ涸摍嘀貫樽髡邔嶒灥贸觯?p>  這就是基巖版JSON文本的全部內(nèi)容了。

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設置
設置
書架
加入書架
書頁
返回書頁
指南