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