第一百零四章 物品的显示属性
在Minecraft中,每个物品都有自己的名字。比如『minecraft:diamond』这个物品就叫做『钻石』、『minecraft:air』就叫做空气......但物品的名字并不是一直都不变的,我们可以通过铁砧来更改物品的显示名称,比如把『钻石』更改为『煤炭』,把『空气』更改为『黄金』.......
但用铁砧改名字十分麻烦,那有没有一种方法,能够通过指令更改物品的名称呢?
在Java版中,是有的。这种方法就是:指定或修改物品的显示属性。
什么是物品的显示属性?我们知道,一个物品有自己的名称,自己的图标(方块类物品除外),还有这个物品显示出来的信息。比如这把钻石剑,它就具有如下的显示属性:
[图标]——钻石剑的图标,是一把蓝色的剑
钻石剑——钻石剑的名称
在主手时:——这个和下面这些都是该物品的信息
7 攻击伤害
1.6 攻击速度
minecraft:diamond_sword ——这个和下面的是打开高级提示框后才会显示的信息
NBT : 1个标签
(配图:104-1)
那我们该如何指定或修改物品的显示属性呢?很简单,通过物品的NBT标签来修改。
物品的disbr /lay标签,是一个复合标签,用来自定义该物品的显示属性。大部分物品并没有这个标签,因为对于游戏来说显示属性弄个默认值就好。
disbr /lay这个复合标签内,有两到三个标签:
color(Int整形)——这个标签仅仅对皮革盔甲才有用,它可以指定皮革盔甲是什么颜色。
Name(文本)——该标签对任何物品都管用,它可以自定义该物品的名称。这东西必须要使用JSON文本。在Java1.13以下版本中,可直接使用普通文本,但无法使用JSON文本。
Lore(文本列表)——该标签对任何物品都管用,它可以自定义该物品的描述。列表中的文本必须要使用JSON文本。在Java1.14以下版本中,可直接使用普通文本,但无法使用JSON文本
看起来还是很简单的,让我们试试能不能获得一个名为『这不是钻石』的钻石:
/give @s minecraft:diamond 1 0 {disbr /lay:{Name:“这不是钻石“}}
\\适用于Java1.8~1.12.2\\
/give @s minecraft:diamond{disbr /lay:{Name:“\“这不是钻石\““}}
\\适用于Java1.13~今\\
/give @s minecraft:diamond{disbr /lay:{Name:'“这不是钻石“'}}
\\适用于Java1.14~今\\
上面给出了三条指令。这三条指令所适用的版本范围各有所不同,但功能都是一样的:会给你一个名叫『这不是钻石』的钻石。
值得注意的是,对于Java1.13及以上版本来说,Name的值虽然说『必须是一个JSON文本』,但如果你尝试下面的指令:
/give @s minecraft:diamond{disbr /lay:{Name:“111“}}
这将会给你一个名叫『111』的钻石。注意!『111』在这并未使用JSON文本,但游戏成功识别了它。这是怎么一回事?
其实不止Name标签,在Minecraft Java版中任意必须使用JSON文本的地方,都具有类似的特性:当使用阿拉伯数字时,可不使用JSON文本。不信?试一试下面的指令:
/tellraw @s 114514
你会发现你正常收到了『114514』这条消息,游戏并未报错。对了,基岩版则没有类似的特性,所以如果你在基岩版运行上面的指令还是会报错的。
回到正题。既然Name标签我们会使用了,那Lore标签呢?
也一样简单。比如我们要获取一个描述为『Never Gonna Give You Ubr /』的13号唱片,只需要:
/give @s record_13 1 0 {disbr /lay:{Lore:[“Never Gonna Give You Ubr /“]}}
\\适用于Java1.8~1.12.2\\
/give @s music_disc_13{disbr /lay:{Lore:[“Never Gonna Give You Ubr /“]}}
\\适用于Java1.13.x\\
/give @s music_disc_13{disbr /lay:{Lore:[“\“Never Gonna Give You Ubr /\““]}}
\\适用于Java1.14~今\\
/give @s music_disc_13{disbr /lay:{Lore:['“Never Gonna Give You Ubr /“']}}
\\适用于Java1.14~今\\
获取到后,你会发现物品的描述并不是白色的文字,而是紫色的文字。在Java1.14以下版本中,由于Lore无法使用JSON文本,自然也就改不了颜色(除非你有办法在NBT中使用§)。但在Java1.14及以上版本中,我们就可以试一试改下颜色:
/give @s music_disc_13{disbr /lay:{Lore:['{“text“:“Never Gonna Give You Ubr /“,“color“:“red“}']}}
上述指令将会给你一个带有红色『Never Gonna Give You Ubr /』描述的物品。
Lore作为一个文本列表,我们这么用还是太屈才了。让我们试试把『Never Gonna Give You Ubr /』拆开:
{Lore:['“Never“','“Gonna“','“Give“','“You“','“Ubr /“']}
\\这是Java1.14及以上版本的例子\\
然后放入指令中运行,你就会发现你获得了一个带有如下描述的13号唱片:
Never
Gonna
Give
You
Ubr /
如你所见,Lore列表内的每一个元素,都代表了一行文本。
这就是Name和Lore的使用方法。那color标签,又该如何使用?
color标签的数据类型是Int整形,也就是一个整数,并不是一个字符串。也就是说,我们并不能使用red、yellow之类的颜色ID,也不能使用RGB或16进制颜色代码。那这个color到底该怎么使用?
color的值要填写的是颜色值。这个颜色值本质上是基于颜色的RGB算出来的,具体公式如下:
R×65536+G×256+B×1
R······Red红色值,0~255
G······Green绿色值,0~255
B······Blue蓝色值,0~255
举个例子。标准黄色的RGB值为(255,255,0),我们就可以通过上述公式算出标准黄色的颜色值为:
255×65536+255×256=16776960
让我们试一试这个值正不正确:
/give @s minecraft:leather_helmet 1 0 {disbr /lay:{color:16776960}}
\\Java1.13之前\\
/give @s minecraft:leather_helmet{disbr /lay:{color:16776960}}
\\Java1.13及之后\\
然后我们就获得了一个颜色为(#FFFF00)的黄色皮革帽子。其中,#FFFF00正是标准黄色的16进制颜色代码。
到这里,物品的显示属性,也就是disbr /lay标签就讲完了,但这不代表本章到此结束。
如果我们不想要显示某些东西该怎么办?
Mojang给了我们一个标签可以用来指定隐藏物品的哪些信息:
HideFlags(Int整形)
HideFlags的使用方式和上面的color有异曲同工之妙。和color类似,HideFlags的值是『信息值』(这名字随便取的),你需要通过以下信息加上具体情况来计算出它的值:
1——附魔信息,对应Enchantments(ench)标签
2——属性修饰符信息,对应AttributeModifiers标签
4——无法损坏信息,对应Unbreakable标签
8——能够破坏的方块信息,对应CanDestroy标签
16——能够放在哪些方块上的信息,对应CanPlaceOn标签
32——其他大部分信息(包括药水效果、魔咒信息[StoredEnchantments标签]、成书的版本和作者信息[generation和author标签]、烟花火箭的信息[Exbr /losion和Fireworks标签]、地图的信息)
64——[1.16.2版本新增]皮革盔甲的颜色信息,对应上面的color标签
比如我们要隐藏皮革盔甲的颜色信息,只需要:
/give @s minecraft:leather_helmet{disbr /lay:{color:16776960},HideFlags:64}
\\Java1.16.2及之后\\
然后你就会惊喜的发现,相比之前的那个黄色帽子,这个新的黄色帽子没有了颜色信息。
但如果我们还要隐藏掉附魔信息该怎么办?
很简单,加起来就可以了:
/give @s minecraft:leather_helmet{disbr /lay:{color:16776960},Enchantments:[{id:“br /rotection“,lvl:255}],HideFlags:65}
\\Java1.16.2及之后\\
运行上述指令,你将会获得一个附魔有保护255级的黄色帽子,但这个帽子并不会显示自己的颜色和附魔信息,除非你用的版本低于1.16.2才会显示出来颜色信息。
不难发现,上面的HideFlags标签的值为65,是将64和1相加得到的。同理,如果你把上面表格的所有信息对应的值都加起来,得到的127这个值就代表所有信息,将其作为HideFlags的值就可以隐藏掉物品的所有信息。
这就是本章的全部内容。
附录①:本章相关历史
Java
1.8——加入了HideFlags标签和能够用来自定义显示属性的disbr /lay标签。
1.13——Name标签现在必须使用JSON文本。原本用来翻译用的LocName标签被合并到了Name标签里。
1.14——Lore标签现在必须使用JSON文本。
1.16.2——为皮革盔甲的颜色信息加入了64(Flag 64)信息值。
附录②:LocName标签用法
和JSON文本的translate组件一样,LocName标签在Java1.13以下版本用于物品名称的翻译。比如:
/give @s diamond 1 0 {disbr /lay:{LocName:“item.combr /ass.name“}}
\\Java1.13以下版本\\
这将会给你一个叫做『指南针』的钻石。如果你把游戏切换成英文,那么这个钻石的名称也会变成『Combr /ass』(指南针的英文)。在上面的指令中,『item.combr /ass.name』是『指南针』这个物品名称的本地化键名。
虽然我们还未接触到Java版的translate组件,但其实Java版JSON的translate组件和基岩版的translate组件的用法几乎一模一样。
......
......
......
......
张三又一次大老远的从主城跑了回来。
『嘿,李四,你看这个附了魔的苹果!』
李四很好奇:『附了什么魔?』
『你自己看』
张三把苹果丢给了李四。
『这没写啊?』
张三从李四的手中拿回苹果,然后说道:『我也不知道。但据某位管理说,谁被这个苹果打到,就会获得无限时长的最高等级幸运效果。』
『真的?快打我一下试试!』
『那你待会也要打我一下,不能够你自己独享』
『OK,毕竟咱俩可是兄弟』
『准备好了吗?3——2——1——』
李四被张三用苹果杀死了