第一百零四章 物品的顯示屬性
在Minecraft中,每個(gè)物品都有自己的名字。比如『minecraft:diamond』這個(gè)物品就叫做『鉆石』、『minecraft:air』就叫做空氣......但物品的名字并不是一直都不變的,我們可以通過鐵砧來更改物品的顯示名稱,比如把『鉆石』更改為『煤炭』,把『空氣』更改為『黃金』.......
但用鐵砧改名字十分麻煩,那有沒有一種方法,能夠通過指令更改物品的名稱呢?
在Java版中,是有的。這種方法就是:指定或修改物品的顯示屬性。
什么是物品的顯示屬性?我們知道,一個(gè)物品有自己的名稱,自己的圖標(biāo)(方塊類物品除外),還有這個(gè)物品顯示出來的信息。比如這把鉆石劍,它就具有如下的顯示屬性:
[圖標(biāo)]——鉆石劍的圖標(biāo),是一把藍(lán)色的劍
鉆石劍——鉆石劍的名稱
在主手時(shí):——這個(gè)和下面這些都是該物品的信息
7 攻擊傷害
1.6 攻擊速度
minecraft:diamond_sword ——這個(gè)和下面的是打開高級(jí)提示框后才會(huì)顯示的信息
NBT : 1個(gè)標(biāo)簽
?。ㄅ鋱D:104-1)
那我們?cè)撊绾沃付ɑ蛐薷奈锲返娘@示屬性呢?很簡(jiǎn)單,通過物品的NBT標(biāo)簽來修改。
物品的display標(biāo)簽,是一個(gè)復(fù)合標(biāo)簽,用來自定義該物品的顯示屬性。大部分物品并沒有這個(gè)標(biāo)簽,因?yàn)閷?duì)于游戲來說顯示屬性弄個(gè)默認(rèn)值就好。
display這個(gè)復(fù)合標(biāo)簽內(nèi),有兩到三個(gè)標(biāo)簽:
color(Int整形)——這個(gè)標(biāo)簽僅僅對(duì)皮革盔甲才有用,它可以指定皮革盔甲是什么顏色。
Name(文本)——該標(biāo)簽對(duì)任何物品都管用,它可以自定義該物品的名稱。這東西必須要使用JSON文本。在Java1.13以下版本中,可直接使用普通文本,但無法使用JSON文本。
Lore(文本列表)——該標(biāo)簽對(duì)任何物品都管用,它可以自定義該物品的描述。列表中的文本必須要使用JSON文本。在Java1.14以下版本中,可直接使用普通文本,但無法使用JSON文本
看起來還是很簡(jiǎn)單的,讓我們?cè)囋嚹懿荒塬@得一個(gè)名為『這不是鉆石』的鉆石:
/give @s minecraft:diamond 1 0 {display:{Name:“這不是鉆石“}}
\\適用于Java1.8~1.12.2\\
/give @s minecraft:diamond{display:{Name:“\“這不是鉆石\““}}
\\適用于Java1.13~今\\
/give @s minecraft:diamond{display:{Name:'“這不是鉆石“'}}
\\適用于Java1.14~今\\
上面給出了三條指令。這三條指令所適用的版本范圍各有所不同,但功能都是一樣的:會(huì)給你一個(gè)名叫『這不是鉆石』的鉆石。
值得注意的是,對(duì)于Java1.13及以上版本來說,Name的值雖然說『必須是一個(gè)JSON文本』,但如果你嘗試下面的指令:
/give @s minecraft:diamond{display:{Name:“111“}}
這將會(huì)給你一個(gè)名叫『111』的鉆石。注意!『111』在這并未使用JSON文本,但游戲成功識(shí)別了它。這是怎么一回事?
其實(shí)不止Name標(biāo)簽,在Minecraft Java版中任意必須使用JSON文本的地方,都具有類似的特性:當(dāng)使用阿拉伯?dāng)?shù)字時(shí),可不使用JSON文本。不信?試一試下面的指令:
/tellraw @s 114514
你會(huì)發(fā)現(xiàn)你正常收到了『114514』這條消息,游戲并未報(bào)錯(cuò)。對(duì)了,基巖版則沒有類似的特性,所以如果你在基巖版運(yùn)行上面的指令還是會(huì)報(bào)錯(cuò)的。
回到正題。既然Name標(biāo)簽我們會(huì)使用了,那Lore標(biāo)簽?zāi)兀?p> 也一樣簡(jiǎn)單。比如我們要獲取一個(gè)描述為『Never Gonna Give You Up』的13號(hào)唱片,只需要:
/give @s record_13 1 0 {display:{Lore:[“Never Gonna Give You Up“]}}
\\適用于Java1.8~1.12.2\\
/give @s music_disc_13{display:{Lore:[“Never Gonna Give You Up“]}}
\\適用于Java1.13.x\\
/give @s music_disc_13{display:{Lore:[“\“Never Gonna Give You Up\““]}}
\\適用于Java1.14~今\\
/give @s music_disc_13{display:{Lore:['“Never Gonna Give You Up“']}}
\\適用于Java1.14~今\\
獲取到后,你會(huì)發(fā)現(xiàn)物品的描述并不是白色的文字,而是紫色的文字。在Java1.14以下版本中,由于Lore無法使用JSON文本,自然也就改不了顏色(除非你有辦法在NBT中使用§)。但在Java1.14及以上版本中,我們就可以試一試改下顏色:
/give @s music_disc_13{display:{Lore:['{“text“:“Never Gonna Give You Up“,“color“:“red“}']}}
上述指令將會(huì)給你一個(gè)帶有紅色『Never Gonna Give You Up』描述的物品。
Lore作為一個(gè)文本列表,我們這么用還是太屈才了。讓我們?cè)囋嚢选篘ever Gonna Give You Up』拆開:
{Lore:['“Never“','“Gonna“','“Give“','“You“','“Up“']}
\\這是Java1.14及以上版本的例子\\
然后放入指令中運(yùn)行,你就會(huì)發(fā)現(xiàn)你獲得了一個(gè)帶有如下描述的13號(hào)唱片:
Never
Gonna
Give
You
Up
如你所見,Lore列表內(nèi)的每一個(gè)元素,都代表了一行文本。
這就是Name和Lore的使用方法。那color標(biāo)簽,又該如何使用?
color標(biāo)簽的數(shù)據(jù)類型是Int整形,也就是一個(gè)整數(shù),并不是一個(gè)字符串。也就是說,我們并不能使用red、yellow之類的顏色I(xiàn)D,也不能使用RGB或16進(jìn)制顏色代碼。那這個(gè)color到底該怎么使用?
color的值要填寫的是顏色值。這個(gè)顏色值本質(zhì)上是基于顏色的RGB算出來的,具體公式如下:
R×65536+G×256+B×1
R······Red紅色值,0~255
G······Green綠色值,0~255
B······Blue藍(lán)色值,0~255
舉個(gè)例子。標(biāo)準(zhǔn)黃色的RGB值為(255,255,0),我們就可以通過上述公式算出標(biāo)準(zhǔn)黃色的顏色值為:
255×65536+255×256=16776960
讓我們?cè)囈辉囘@個(gè)值正不正確:
/give @s minecraft:leather_helmet 1 0 {display:{color:16776960}}
\\Java1.13之前\\
/give @s minecraft:leather_helmet{display:{color:16776960}}
\\Java1.13及之后\\
然后我們就獲得了一個(gè)顏色為(#FFFF00)的黃色皮革帽子。其中,#FFFF00正是標(biāo)準(zhǔn)黃色的16進(jìn)制顏色代碼。
到這里,物品的顯示屬性,也就是display標(biāo)簽就講完了,但這不代表本章到此結(jié)束。
如果我們不想要顯示某些東西該怎么辦?
Mojang給了我們一個(gè)標(biāo)簽可以用來指定隱藏物品的哪些信息:
HideFlags(Int整形)
HideFlags的使用方式和上面的color有異曲同工之妙。和color類似,HideFlags的值是『信息值』(這名字隨便取的),你需要通過以下信息加上具體情況來計(jì)算出它的值:
1——附魔信息,對(duì)應(yīng)Enchantments(ench)標(biāo)簽
2——屬性修飾符信息,對(duì)應(yīng)AttributeModifiers標(biāo)簽
4——無法損壞信息,對(duì)應(yīng)Unbreakable標(biāo)簽
8——能夠破壞的方塊信息,對(duì)應(yīng)CanDestroy標(biāo)簽
16——能夠放在哪些方塊上的信息,對(duì)應(yīng)CanPlaceOn標(biāo)簽
32——其他大部分信息(包括藥水效果、魔咒信息[StoredEnchantments標(biāo)簽]、成書的版本和作者信息[generation和author標(biāo)簽]、煙花火箭的信息[Explosion和Fireworks標(biāo)簽]、地圖的信息)
64——[1.16.2版本新增]皮革盔甲的顏色信息,對(duì)應(yīng)上面的color標(biāo)簽
比如我們要隱藏皮革盔甲的顏色信息,只需要:
/give @s minecraft:leather_helmet{display:{color:16776960},HideFlags:64}
\\Java1.16.2及之后\\
然后你就會(huì)驚喜的發(fā)現(xiàn),相比之前的那個(gè)黃色帽子,這個(gè)新的黃色帽子沒有了顏色信息。
但如果我們還要隱藏掉附魔信息該怎么辦?
很簡(jiǎn)單,加起來就可以了:
/give @s minecraft:leather_helmet{display:{color:16776960},Enchantments:[{id:“protection“,lvl:255}],HideFlags:65}
\\Java1.16.2及之后\\
運(yùn)行上述指令,你將會(huì)獲得一個(gè)附魔有保護(hù)255級(jí)的黃色帽子,但這個(gè)帽子并不會(huì)顯示自己的顏色和附魔信息,除非你用的版本低于1.16.2才會(huì)顯示出來顏色信息。
不難發(fā)現(xiàn),上面的HideFlags標(biāo)簽的值為65,是將64和1相加得到的。同理,如果你把上面表格的所有信息對(duì)應(yīng)的值都加起來,得到的127這個(gè)值就代表所有信息,將其作為HideFlags的值就可以隱藏掉物品的所有信息。
這就是本章的全部?jī)?nèi)容。
附錄①:本章相關(guān)歷史
Java
1.8——加入了HideFlags標(biāo)簽和能夠用來自定義顯示屬性的display標(biāo)簽。
1.13——Name標(biāo)簽現(xiàn)在必須使用JSON文本。原本用來翻譯用的LocName標(biāo)簽被合并到了Name標(biāo)簽里。
1.14——Lore標(biāo)簽現(xiàn)在必須使用JSON文本。
1.16.2——為皮革盔甲的顏色信息加入了64(Flag 64)信息值。
附錄②:LocName標(biāo)簽用法
和JSON文本的translate組件一樣,LocName標(biāo)簽在Java1.13以下版本用于物品名稱的翻譯。比如:
/give @s diamond 1 0 {display:{LocName:“item.compass.name“}}
\\Java1.13以下版本\\
這將會(huì)給你一個(gè)叫做『指南針』的鉆石。如果你把游戲切換成英文,那么這個(gè)鉆石的名稱也會(huì)變成『Compass』(指南針的英文)。在上面的指令中,『item.compass.name』是『指南針』這個(gè)物品名稱的本地化鍵名。
雖然我們還未接觸到Java版的translate組件,但其實(shí)Java版JSON的translate組件和基巖版的translate組件的用法幾乎一模一樣。
......
......
......
......
張三又一次大老遠(yuǎn)的從主城跑了回來。
『嘿,李四,你看這個(gè)附了魔的蘋果!』
李四很好奇:『附了什么魔?』
『你自己看』
張三把蘋果丟給了李四。
『這沒寫?。俊?p> 張三從李四的手中拿回蘋果,然后說道:『我也不知道。但據(jù)某位管理說,誰被這個(gè)蘋果打到,就會(huì)獲得無限時(shí)長的最高等級(jí)幸運(yùn)效果?!?p> 『真的?快打我一下試試!』
『那你待會(huì)也要打我一下,不能夠你自己獨(dú)享』
『OK,畢竟咱倆可是兄弟』
『準(zhǔn)備好了嗎?3——2——1——』
李四被張三用蘋果殺死了