本帖最后由 Dahesor 于 2023-3-3 09:00 编辑
☆【命令】命令教程"真"从零开始(十
七
)☆
☆彩色文字,命令书,JSON文本☆
声明:
1.
本系列教程默认读者拥有关于Minecraft游戏本身的基础了解。
2.
本系列全部教程绝对适用于当前Java最新版
(1.19.3)
。
3.
本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。
4.
本教程
需要读者有特定的命令知识。这些这些内容在
下方表格中列出
:
<<<<<< 返回系列目录 ←←
需要前置知识:
请确保你理解下列的内容。下表的所有内容一定在本系列教程的某一帖讨论过,所以若您是从本系列第一帖起阅读至今,可以不用看。
对于跳跃式阅读的读者,还请检查一番:
在开始教程前,我要先说两句。
本文是关于JSON文本的教程,若果你对JSON很熟悉的话完全不需要看本教程,请直接移步到
Wiki的页面
,那里有关于所有键值对的详细说明。
如果你完全对JSON感到陌生,那么感谢你点开了这个帖子,我会尽全力讲明白。但是你要注意,虽然我已经尽可能做得亲民,阅读本教程仍是一个很费脑的工作。若果你只是在地铁或者躺在床上带着轻松的心情扫一遍本文,那你大概率只是会在下面回一句“好难啊看不懂”,然后再被绵羊版主扣分。
……我毫无办法。
请挑一个清醒的时候阅读本教程,若果条件允许的话,请准备好笔记本,打开Minecraft在一旁。
本文会给予你对JSON文本的一个整体的概念,但若不实际应用,即使你认真读过,心里也会发虚,不知道自己到底看懂没。
所以,请在Minecraft中执行一遍下面提到的所有命令,并自行举一反三。
(由于下面的命令有些已经长到超出聊天框输入限制,你可能需要一个命令方块)
如果你这样还没有看懂的话,抱歉我还是没有办法——你有两个选择,
要么放弃,要么再看一遍
。
话说到这里,我们正式开始。
前言
当你制作一张地图的时候,你一定需要某种方式来与玩家沟通,比如告知他们游戏规则,阐述剧情等。
该如何做到这一点呢?
你最容易想到的就是告示牌,但我们还有其他的,更简洁的方法,即在聊天框中发送信息。
你可能见过这些信息,它们有的是彩色的,有的有特殊格式,有的点击可以运行命令。
今天,我们就要了解,如何制作彩色文字。
与JSON文本。
JSON的内容我会拆成两帖来讲。这个是第一帖,描述它的基础逻辑与格式,而下一帖则会讨论它在NBT中的应用(比如制作命令书),与转义等问题。
那,我们开始吧。
1. 导言
如何向玩家发送一条信息?
最最简单的命令是/say:
格式:
十分的简单,只需要将你想要广播的信息放到/say的后面就好了:
比如:
-
/say 那个ID是Dahesor的人的外表十分出众
复制代码
所有玩家就可以在聊天框中看到:
信息中还可以包含
空格
和
选择器
,十分方便。
比如:
输出为:
注意选择器“@p”被替换为了我的ID。
这种简单的方法适用于很多情况,但是有些时候地图创作者的要求更高。
比如……你可能发现了,聊天框中的那一行字是白色的,没有任何特殊格式。
那么,如果我想要在聊天框中输出一条彩色的信息,要怎么办呢?
我们要使用另一条命令搭配一种特殊的格式来做到这一点。
这个命令叫作
“/tellraw”
本命令可以在聊天框中显示带有特殊格式的文字。
格式:
我们只要把<目标玩家>替换为想要通知的玩家,后面再加上你想要发送的信息,本命令就会向选中的玩家发送指定的信息。
但是……后面的“信息”该怎么写呢?
这样么?
-
/tellraw @a Dahesor的外貌十分出众
复制代码
按照逻辑,这样是不是就可以向所有玩家发送信息
“Dahesor的外貌十分出众”
?
很遗憾,不是的。
和/say命令不同,/tellraw命令无法直接在后面附上信息。我们需要将信息写成一种特殊的格式。
这种格式叫做“
JSON
”。
用这种格式写成的文字叫做
“
原始JSON文本
”
。
2. JSON
JSON
(
J
ava
S
cript
O
bject
N
otation,JavaScript物件表示法)
(读作“/ˈdʒeɪsən/” ,来跟我读,Jay~Saan)是一种计算机语言(不是编程语言)。
它是由一个叫做道格拉斯的研究计算机的老头子创建的(好吧,他创建的时候还不是很老)
这种语言是由JavaScript发展出来的,
是JavaScript的一个子集。
是的,这种语言不是Mojang搞得,而是通用的。
——以上信息和我们今天的教程几乎一点关系都没有。上面一段话你也不用理解。
我们要讲的,并不是“
JSON
”,而是用这种格式写成的文本
“
原始JSON文本
”
(Raw JSON Text)
。
不要把
JSON
和
JSON文本
弄混,
JSON
不是专门用来写文字的,它可以做的事情很多,
JSON文本
只是按照
JSON
的格式写就的文字而已。
你可以这么理解:
JSON
就像一张表格,你往里面填什么都行,而
JSON文本
是一种规定,它规定了“表格的哪一行要填什么。”
但是你填什么和
JSON
一点关系都没有。
所以说“
JSON
”这个表格不是Mojang发明的,但是“
JSON文本
”,即“表格中哪一行要填什么”,是Mojang创建的东西。
不知道我说明白没有。
3. 原始JSON文本
注意:以下内容只适用于Java版
基岩版的原始JSON文本格式有一定不同,更加简单且严格,详
见此
所以让我们把JSON抛开,单独来看JSON文本。
Minecraft中,几乎所有的文字都是由这种格式写就的,比如聊天框的文字,物品的命名与描述,书,告示牌,生物的名字,队伍的名字等等等等。
JSON允许文字带有颜色,字体,形态,或点击执行命令等,也就是你熟知的命令书,命令告示牌等。
所有地方的文字都采用相同的格式,但为了方便,今天我们只看聊天框文字,与命令/tellraw。
JSON文本听起来很高大上,但实际上就是对一个带有格式的文字的一种表达方式而已。比如下面的一串JSON文本:
-
[{"selector":"@p","color": "red"},{"text": "的外貌十分出众","color": "blue","italic": true,"underlined": true}]
复制代码
我们把它扔进上面讲过的/tellraw命令里就是这样:
-
/tellraw @a [{"selector":"@p","color": "red"},{"text": "的外貌十分出众","color": "blue","italic": true,"underlined": true}]
复制代码
本命令会向所有玩家发送后面的JSON信息。
上面的代码经过游戏解析后,你最终会看到:
你可以注意到我把自己的ID染成了红色,把其余的内容染成蓝色,而且后半部分变为了斜体,还画了一道下划线。
上面的JSON文本看起来比较复杂,但实际上只是因为我写了一个复杂的JSON文本而已。
最简单的JSON文本实际上非常简单,
它长这样:
对,就是一对双引号。
然而这个JSON文本是空的,换句话说,如果将这个JSON文本输出成“人类阅读”的文字,你什么都看不到。
想要加入一些文字也不难,你只需要把你想要添加的文字放到
两个双引号中间
就好了:
比如这样:
我们在双引号之间加入一串文字。
现在只要把它装进/tellraw命令里:
-
/tellraw @a "Dahesor的外貌十分出众"
复制代码
向所有玩家发送后面的JSON信息。
这一串JSON文本会输出为:
就这么简单。无论你想发送什么,只要把它装进双引号
""
里,放到/tellraw里面就好了。
(几乎是的)
要注意的是,双引号是英文的双引号
""
而不是中文的
“”
。你要注意英文的双引号是没有上引号下引号之分的,中文是有的。
那,你已经得到了第一个JSON文本,但是使用这个用双引号围起来的方法,你所看到是一串没有颜色,没有格式的文本。
该如何做到像上面的“
Dahesor
的外貌十分出众
”那样带有颜色与格式的文字呢?
实际上,上面的双引号围文字的方式只是一个更复杂的一点的JSON文本的简写。
实际上只是简写。
它的
完整形式
其实是:
-
{"text": "Dahesor的外貌十分出众"}
复制代码
上面的两串JSON文本效果
完全相同
,但是第二个“完全体”要复杂得多。
你可以发现JSON文本从
"Dahesor的外貌十分出众"
变成了
{"text": "Dahesor的外貌十分出众"}
。
现在,我要你忘记原来的,简单地把文字装进双引号的办法。
让我们重新开始看这一条JSON
3.1
获得一个JSON文本
我们把上面的JSON拿来,再标注颜色以便您阅读:
{
"
text
"
:
"
Dahesor的外貌十分出众
"
}
如果你对代码有恐惧症,放轻松,放轻松。这不复杂,上面的JSON文本的组成十分简单。
从上面的JSON中你应当注意到:
-
它的两侧由花括号“
{ }
”包围。这对花括弧
标志了该JSON文本的开始,与结尾
-
在花括弧内部,我们有
text
与
Dahesor的外貌十分出众
两项内容
-
两项内容本身各自都由引号
" "
包围,这对引号
指示了这一个内容的起始与结束
,就像最外面的花括弧指示了JSON的起始与结束一样。
-
两个内容之间由冒号“
:
”分隔。
-
"
text
"
是“文字”的意思,
"
Dahesor的外貌十分出众
"
是我们要显示的文字。
-
换句话说,代码片段
"
text
"
:
"
Dahesor的外貌十分出众
"
实际上就指明了“
我们要显示的文字(text)是
Dahesor的外貌十分出众
”。
-
类似 "text": "Dahesor的外貌十分出众" 这样的一对内容被称为“
键值对
”。
-
类似格式的内容我们还能写出很多,比如
"颜色": "蓝色"
或者
"喝什么": "牛奶"
。
-
冒号前面的内容(颜色,喝什么,text)指明了该键值对在规定什么东西,冒号后面的内容(蓝色,牛奶,Dahesor的外貌十分出众)指明了该键值对规定的内容的值。
-
用大白话说,"颜色": "蓝色"表示了颜色是蓝的,"喝什么": "牛奶"表达了我喝的是牛奶,而"text": "Dahesor的外貌十分出众"就表达了显示的文字是Dahesor的外貌十分出众
-
而这样一个包含了一个或数个键值对的花括号,被称为一个
对象(Object)
这实际上就是JSON的基础格式了。JSON可以由一个或数个键值对组成,再由大括号包围。
我们的第一个JSON文本
{"text": "Dahesor的外貌十分出众"}
中只包含了一个键值对,指明了我们要显示的文字。
把它输出成人看的文字就是:
接下来,如果想要为这个文字添加颜色,只要去再添加一个键值对来指明颜色即可,比如:
{
"
text
"
:
"
Dahesor的外貌十分出众
"
,
"
color
"
:
"
blue
"
}
这一串JSON文本在上一串的基础上,还规定了文字的颜色。
你应当注意到:
-
除了原先的键值对
"
text
"
:
"
Dahesor的外貌十分出众
"
指明了“文字内容”以外,我们又多了一对键值对
"
color
"
:
"
blue
"
-
color是颜色的意思,blue是蓝色,所以
"
color
"
:
"
blue
"
表达了
颜色是蓝色
。
-
我们有两个键值对,一个text指明了文本内容,一个color指明了颜色。
-
两个键值对之间以逗号
,
相隔。
-
再次说明,这样一个包含了一个或数个键值对的大括号,被称为一个
对象 (Object)
把上面的内容装进/tellraw里:
-
/tellraw @a {"text": "Dahesor的外貌十分出众", "color": "blue"}
复制代码
你就可以在聊天框看到:
这样一串蓝色的文本。
当然我们呢也可以用其他的文字和颜色,比如:
-
/tellraw @a {"text": "祝你好运!", "color": "red"}
复制代码
我们把文字"text"改成了 "祝你好运!",并把颜色"color"从蓝色("blue")改成了红色("red")。
所以上面的命令执行后,就可以在聊天框看到:
同理:
-
/tellraw @a {"text": "MCyyds", "color": "green"}
复制代码
green是绿色,所以本命令显示:
OK。应该不难,即使你没理解我上面讲的内容,光看这几个例子你也大概就能明白了。
在上面的3个例子中,文字被分别调成了blue蓝色,red红色,和green绿色,那么,下面给出所有可用的颜色:
"black" 黑色
"dark_blue" 深蓝色
"dark_green" 深绿色
"dark_aqua" 蓝绿色
"dark_red" 深红色
"dark_purple" 深紫色
"gold" 金色(橙色)
"gray" 灰色
"dark_gray" 深灰色
"blue" 蓝色
"green" 绿色
"aqua" 青色
"red" 红色
"light_purple" 粉色
"yellow" 黄色
"white" 白色
"reset" 默认(无颜色)
除此之外,可以使用
"#<hex>"
来规定其他任何HTML颜色
你可以在类似
这个网站
来寻找你想要的颜色,比如,该网站中”猩红“的代码是"#DC143C",那么填进去就好了。
|
OK,如果你觉得需要的话,以下是更多示例:
1.
-
/tellraw @a {"text":"ABCDEFG", "color":"dark_blue"}
复制代码
根据上面的表格,dark_blue是深蓝色。
效果:
2.
-
/tellraw @a {"text":"HW!", "color":"gold"}
复制代码
你可以发现颜色列表里没有橙色。
但实际上,金色“gold”就是橙色:
效果:
3.
-
/tellraw @a {"text":"a1234567"}
复制代码
没有规定颜色,所以使用默认颜色:
效果:
4.
-
/tellraw @a {"text":"HEX颜色无所不能!", "color":"#4169E1"}
复制代码
#4169E1为皇家蓝(Royal Blue)的颜色代码。(该颜色之所叫“皇家”是因为这种颜料在以前很难制造,因此很贵)
效果:
|
3.2 布尔值
非常棒,相信你现在已经可以使用JSON文本熟练地广播一条带有颜色的文字了!
然而,除了颜色,JSON文本远远没有这么一小点东西。
接下来,我们来学习如何将文字变成斜体。
在上面的数个例子中,每一条JSON都有两个“项”或者说“键值对”,一个"text"规定文本内容,一个"color"规定文本颜色。
那么,如果我们需要规定文字的斜体属性,理应再加入一个新的键值对。
这个项目叫做
"italic"
。
就像"color"规定了颜色一样,"italic"规定了文本是否为斜体。
不过一个明显的区别是,颜色"color"可以有很多种,但是斜体"italic"只有两种可能,
要么
是
斜体,要么
不是
斜体。
我们使用了类似“red”这样的一串字符来表达颜色,但对于斜体,
我们使用
true
代表是斜体(true是“
真
”的意思),或者用
false
代表不是斜体(false是“
假
”的意思)。
比如,这样一条JSON文本:
-
{"text":"这是一条斜体文字", "color": "red"}
复制代码
让我们尝试把它变成斜体的:
-
{"text":"这是一条斜体文字", "color": "red", "italic": true}
复制代码
你应当注意到:
-
除了
"text"
和
"color"
外,我们新增了一个
"italic"
来规定斜体。
-
就像之前做的一样,我们使用
逗号
来将新的项目分隔开来。
-
就像之前做的一样,
"italic"
和
true
之间为
冒号
,以表达两者的关系。
-
新增的"italic"就像"text"或"color"一样,由引号包围。注意在JSON中所有的“键”,即“冒号前面的内容”都总是被双引号括起。
看起来这个新的“斜体”好像遵循和原来的两个完全一样的规律,但实际上,有一个巨大的不同。
我将每一对键值对拿出来:
-
"
text
"
:
"
这是一条斜体文字
"
-
"
color
"
:
"
red
"
-
"
italic
"
: true
注意到不同了么?
所有内容都是由双引号""包围的,比如"color",或者"red",或是"这是一条斜体文字"
只有true不是。true在上面的代码中直接写为true,没有加双引号。
为什么?
因为类似
"red"
或者
"这是一条斜体文字"
是一串代表特定概念的字符串,但是
true本身就是一个概念
。
"red"是红色的意思,但是JSON不管这个,JSON这种格式不在意你在双引号里添了什么。记得我们一开始就说过得东西么?JSON就是个表格,你填什么都行。
JSON这个语言本身不理解双引号
""
里是什么意思,解析
""
里面的内容的是Minecraft。
JSON只是个表格,是Minecraft在读“表格里写了啥”
但true不一样,true就是真,它相当于 “打勾”。
看看下面这张图:
换言之,用"red"代表红色是Minecraft规定的,并不通用于JSON,但是true是通用的。
true代表真,false代表假,当JSON出现这两者时,
不用加双引号
。
这种要么真要么假的值,被称为
布尔值(Bolean)
。
JSON的每个值都可以是由双引号
" "
包围的字符串,或者是代表
真
或
假
的布尔值,即
true
与
false
。
无论使用JSON的软件如何解析字符串,对JSON来说就只是一串文本,但是布尔值是一个概念(真或假)
对于没有看懂以上解释的读者,请只记住,
true和false不用加双引号。
没有为啥,JSON这么规定的。
OK,相信你看完了上面的解释。
那么看看例子:
-
/tellraw @a {"text":"一串文字", "color": "blue", "italic": true}
复制代码
注意:
-
我们设置了文字为“一串文字”,颜色为蓝色。
-
后面的"italic": true代表是斜体,因为true代表真。
所以该命令的效果为:
反过来看:
-
/tellraw @a {"text":"一串文字", "color": "blue", "italic": false}
复制代码
同样的命令,同样的JSON文本,只是把true换成了false。
此时的"italic: false"代表不是斜体,因为false代表假。
所以效果为:
当然,允许省略italic:
-
/tellraw @a {"text":"一串文字", "color": "blue"}
复制代码
省略了italic,即“斜体”这一属性将被设为默认值,对于/tellraw命令发送的信息而言,默认值是不是斜体。
因此省略italic会获得不是斜体的文字。
但有的地方的默认值是“是斜体”(比如,物品的自定义名称),这时省略italic会获得斜体文字。
当然,不只是italic,所有其他可省略的项目省略后都设为默认值。
3.3 举一反三
好,现在你知道如何为文字添加斜体了。
当然不止斜体,我们还可以为文字添加
粗体(
bold
)
,
下划线(
underlined
)
,
删除线(
strikethrough
)
,
与乱码(
obfuscated
)
。
就像
斜体(
italic
)
一样,以上的4项都是布尔值,即要么true要么false。
粗体,下划线,与删除线应该不用解释,唯一可能需要解释的是乱码。这玩意如果设为true就会使文字变成这样:
OK,那,看向下面的命令:
-
/tellraw @a {"text": "这什么玩意乱糟糟的", "color": "red", "bold": true,"italic": true, "strikethrough": true, "obfuscated": false, "underlined": true}
复制代码
好,在上面的/tellraw命令要输出的JSON中,我们的文字是"这什么玩意乱糟糟的",颜色是红色。
接下来,除了乱码(obfuscated)调成false以外,其他所有都调成了true。
所以上面的玩意的效果为:
你将会看到这个被同时加了斜体粗体下划线与删除线的东西。
那么,我相信你现在可以为文字添加各式各样的字体了。
不过如果你认为需要的话,下面是更多例子:
1.
-
/tellraw @p {"text": "一行粗体","bold": true}
复制代码
效果:
2.
-
/tellraw @p {"text": "这个又粗又斜","bold": true, "italic":true}
复制代码
效果:
3.
-
/tellraw @p {"text": "下划线", "underlined": true}
复制代码
效果:
4.
-
/tellraw @a {"text": "真不错","color": "blue","underlined": true,"bold": true}
复制代码
上面颜色被调为蓝色,下划线(underlined)与粗体(bold)被设为true。
其余省略的内容将会被设为默认值,(这种情况下,默认值是false)
效果:
5.
-
/tellraw @a {"text": "我很可爱!请给我钱!","italic": false,"bold": true}
复制代码
上面斜体(italic)设为false,粗体(bold)设为true。
注意没有设置颜色,所以颜色为默认。其他没有提及的项目也均为默认。
效果:
6.
-
/tellraw @a {"text": "1+1=2", "bold": false,"italic": false, "strikethrough": false, "obfuscated": false, "underlined": false}
复制代码
所有均调成false,且省略了颜色。
效果:
注意上面的命令与
-
/tellraw @a {"text": "1+1=2"}
复制代码
效果等价。
7.
-
/tellraw @a {"text": "因为文字会变成乱码,所以写什么都无所谓。","obfuscated": true, "color": "yellow"}
复制代码
字体乱码被设为true,颜色为黄。
效果:
8.
-
/tellraw @a {"color":"red","strikethrough": true, "text": "lalala"}
复制代码
我用这样的一个例子告诉你,键值对的顺序不重要,你完全可以把"color"放最前面,"text"放在最后面。
效果:
9.
-
/tellraw @a {"text": "这种颜色叫做秋麒麟", "color": "#DAA520", "underlined":true}
复制代码
效果:
10.
-
/tellraw @a {"text": "abc","color":"green", "bold": true, "bold": false}
复制代码
如果你不小心写了两个同样的项目,比如上面有两个bold,那么后面的会覆盖前面的。
效果:
|
3.4 列表
提醒:本段内容较难以纯逻辑讲述,需要配合实例食用。
请在读过所有解释,对列表与"extra"有一定概念后,详细研究段末给出十余条实例。
OK,相信你现在已经可以熟练地给文字加上颜色与形态了。
你已经可以轻松地制作出像是 “
真红
” 或者 “
啊我死了
” 这样的文字了。
那么,你该如何实现这个呢?
控制颜色的键值对叫做"color",上面已经出现过很多次了,但问题是这个"color"只是控制全部的颜色,要么全红,要么全黄,无法做出彩色的东西。
这样该怎么办么?我们需要把不同的颜色分开,分成数个不同的对象,再将他们按顺序放到
列表
里。
比如,
哇
彩色
的
哎!
是彩色的你不会做,但是单一个红色的“
哇
”你是知道怎么做的:
-
{"text": "哇", "color":"red"}
复制代码
对吧。
后面的几个也同理,我们把每个有相同属性的文字拿出来:
-
{"text": "彩色", "color":"gold"}
-
{"text": "的", "color":"green"}
-
{"text": "哎!", "color":"blue"}
复制代码
OK,上面的4个JSON文本分别描述了一个或者数个有相同属性的字符,那我们只要把它们按顺序连在一起就好了。
这时,我们使用列表——方括号"
[ ]
"包围,以逗号相隔:
-
[{"text": "哇", "color":"red"}, {"text": "彩色", "color":"gold"}, {"text": "的", "color":"green"}, {"text": "哎!", "color":"blue"}]
复制代码
你应该注意到:
-
我们实际上没有做什么,只是把5个JSON文本连在一起。
-
唯一的更改是,外围由方括号"[ ]"包围,方括号内是数个并列的JSON,
-
且每个JSON之间由逗号相隔。
-
这种格式叫做
列表(List)
。
上面的这串JSON,会被Minecraft按顺序解读,最后输出为:
我们多举一个例子:
看下面的文本:
该如何使用JSON文本来显示上面的文字?
我们可以把上面的句子分成3段,第一段是“我!”,没有任何颜色或格式。第二段是“
Dahesor!
”,这一段是蓝色且粗体。第三段是“
打钱!
”,这一段是红色的。
那么,我们就可以分别写出这三段的JSON:
我!
-
{"text": "Dahesor!", "color": "blue", "bold": true}
复制代码
Dahesor!
-
{"text": "打钱!", "color": "red"}
复制代码
打钱!
把它们封装进列表里,再安进/tellraw命令中::
-
/tellraw @a [{"text": "我!"}, {"text": "Dahesor!", "color": "blue", "bold": true}, {"text": "打钱!", "color": "red"}]
复制代码
上面的命令输出为:
完成。
只要你肯好好看两遍,应该不难理解。不过即使你理解了的话可能心里也会有点发虚,没关系,这一节末一样有例子。
但在举例之前,我们先来看另一个东西。
下面有一串文字,请你用JSON表达:
OK。你要注意到,上面一行字并不是只有一种属性。有些是蓝色的,有些是绿色的。那么这样只用一个JSON的组件是解决不了了,需要用刚讲过的列表。
我们还可以发现,整串文字都是粗体加下划线,唯一不同的属性就是颜色。“
反复
”都是绿色,“
横跳
”都是蓝色。
那么,按照上面刚讲过刚讲过的方法,这行字要写成这样:
-
[{"text": "反复", "bold": true, "underlined": true, "color": "green"}, {"text": "横跳", "bold": true, "underlined": true, "color": "blue"}, {"text": "反复", "bold": true, "underlined": true, "color": "green"}, {"text": "横跳", "bold": true, "underlined": true, "color": "blue"}]
复制代码
好长啊。明明每一部分都有两个重复的属性,但是因为颜色这个属性是不同的,就要重写。
那,有没有简单点的方法呢?
有。这个东西和"text","color"一样,也是一个键值对。它叫做
"extra"
。
extra是英文“
额外
”或“
附加
”的意思。
"extra"为一个JSON组件规定它的“
附属项
”,这些附属项会
继承上一级的特性
。
"extra"的值并不是字符串也不是布尔值,而是列表。
我们在之前讲过了列表,大概长这样:
[{...}, {...}, {...}]
现在,这个列表不再是在“外面”,而是成为了
"extra"的值
:
比如:
-
{"text": "枯藤", "color": "red", "extra": [{"text": "老树"}, {"text": "昏鸦"}] }
复制代码
上面的JSON文本中,我们首先规定了“
枯藤
”为红色。但除了被使用的"text"和"color"外,还多了一个
"extra"
与其
列表
。
"extra"后面的东西
[{"text": "老树"}, {"text": "昏鸦"}]
拿出来就是一个正常的列表,现在只是放进去成为了一个附属而已。
像上面说过的,extra的附属项会继承原来的属性,
除非被重新覆盖
,所以即使后面的 [{"text": "老树"}, {"text": "昏鸦"}] 并没有规定颜色是红色,但是“
老树
”和“
昏鸦
”还是会成为红色,因为他们的上一级“枯藤”规定了
"color": "red"
。
所以命令:
-
/tellraw @a {"text":"枯藤","color": "red","extra": [{"text": "老树"}, {"text": "昏鸦"}] }
复制代码
显示为:
下一步,我们稍稍改动一下上面的命令:
-
/tellraw @a {"text":"枯藤","color":"red","extra": [{"text": "老树"}, {"text": "昏鸦", "color": "blue"}] }
复制代码
其他的都没变,只是我们在最后一个“昏鸦”后面加上了一个
"color": "blue"
规定其颜色为
蓝色
。
我们刚刚说过,"extra"后列表内的内容会继承前面的特性,
除非被覆盖
。
在新的命令中,最前面规定了颜色为红色。在"extra"后面的附属项中,如果没有重新规定颜色,则会继承“颜色为红色”,比如“老树”。
但是“昏鸦”现在重新规定颜色为蓝色,
覆盖
了继承过来的红色属性,所以,上面命令的效果为:
你有没有看明白"extra"?
这种模式有没有有一点烧脑?
(我建议你在这里先理一理思路,完全理解extra)
但实际上在上面的例子里你完全不需要用"extra",
因为列表有一个功能,就是
第一项的内容会被视为"extra"的母项,后面的每一项都会都被视为附属项
,继承第一项内容的属性,
除非被覆盖
。
比如,还是这个枯藤老树昏鸦的例子,但这回我们不把“老树”和“昏鸦”放到"extra"里,而是拿出来放到并列的列表里:
-
/tellraw @a [{"text": "枯藤", "color": "red"}, {"text": "老树"}, {"text": "昏鸦"}]
复制代码
你可以发现,我们只在第一个“枯藤”里规定了颜色为红色,“老树”和“昏鸦”都没规定。我们没有用“extra”哦,这是列表。
但是上面的命令并不会输出为“
枯藤
老树昏鸦
”,而是会输出为:
JSON文本中
,
最外侧
列表的的本质就是一个首项接着数个附属项
。第一个里面规定了颜色为红,所以整个都变成了红色。
或者说:
-
/tellraw @a [{"text": "枯藤", "color": "red"}, {"text": "老树"}, {"text": "昏鸦"}]
复制代码
和
-
/tellraw @a {"text": "枯藤", "color": "red", "extra": [{"text": "老树"}, {"text": "昏鸦"}]}
复制代码
是等价的!
对于连接了数个JSON文本的列表,其本质就是,第一项会被视为母项,后面接的所有内容都会被视为第一项的"extra"。
但是也要注意
只
是"
第一项
",所以这条命令:
-
/tellraw @a [{"text": "枯藤"}, {"text": "老树", "color": "red"}, {"text": "昏鸦"}]
复制代码
我们把"color": "red"挪到了第二个“老树”处
就会输出为:
第二项也是第一项的附属项,和第三项是并列的。
它无法影响和它并列的第三项,以及是它上级的第一项。
因为这条命令等价于
-
/tellraw @a {"text": "枯藤", "extra":[{"text": "老树", "color": "red"}, {"text": "昏鸦"}]}
复制代码
而"extra"内的子项之间不会互相影响。
那么让我们看回
反复
横跳
反复
横跳
,该如何用"extra"在不重复他们重复属性的情况下写JSON文本呢?这样:
-
/tellraw @a {"text": "反复", "bold": true, "underlined": true, "color": "green", "extra": [{"text": "横跳", "color": "blue"}, {"text": "反复"}, {"text": "横跳", "color": "blue"}] }
复制代码
-
在上面,我们主项第一个“
反复
”规定了字体为粗体下划线,颜色为绿。
-
后面的"extra"接了3个附属项
-
第一个“
横跳
”继承了粗体与下划线,并重新覆盖了颜色为蓝。
-
第二个“
反复
”没有覆盖任何东西,完全继承原属性。
-
第三个“
横跳
”与第一个“
横跳
”相同。
最终,本命令输出为:
那么,不用"extra",和上面命令等价的列表是什么呢?
这个:
-
/tellraw @a [{"text": "反复", "bold": true, "underlined": true, "color": "green"}, {"text": "横跳", "color": "blue"}, {"text": "反复"}, {"text": "横跳", "color": "blue"}]
复制代码
这条命令同样输出为:
反复
横跳
反复
横跳
好。
若看得完全一塌糊涂,要么放弃,要么再看一遍。
若你觉得自己基本明白我在说什么,不,连
基本
明白都不用。毕竟使用一个东西并不需要得知他的原理。你只要对上面讲的有基础概念就好,下面的11条示例会让你明白怎么用的
1.让我们从最简单的列表开始:
-
/tellraw @a [{"text": "ABC", "color": "red"}, {"text": "DEF", "color": "blue"}]
复制代码
文字被分为两个JSON对象,一个设为红色,一个设为蓝色。
效果:
2. 稍微做点改动:
-
/tellraw @a [{"text": "ABC", "color": "red"}, {"text": "DEF"}]
复制代码
这回我们去掉了"DEF"的蓝色属性,但是DEF不会因此变成默认色,因为它算作是列表第一项"ABC"的附属,会继承它的红色属性。
效果:
3. 把上面的命令改一下,将后半部分放进"extra"里:
-
/tellraw @a {"text": "ABC", "color": "red", "extra": [{"text": "DEF"}]}
复制代码
本条命令和上一条等价。
效果:
当然本命令和直接
/tellraw @a {"text": "ABCDEF","color": "red"}
效果等价,如果不是为了举例我是不会这样写的。
4. 把上面的命令再改一下:
-
/tellraw @a {"text": "ABC", "color": "red", "extra": [{"text": "DEF", "bold":true}]}
复制代码
我们为"extra"的附属项添加了一个
"bold":true
规定其为粗体,同时该附属项还继承了“红色”属性。
效果:
注意后半部分加粗了。
5. 再改一下命令:
-
/tellraw @a {"text": "ABC", "color": "red", "italic":true, "extra": [{"text": "DEF", "bold":true, "italic":false}]}
复制代码
在前面的“ABC”上,我们新规定了
"italic":true
,即斜体,但是在附属项中,我们又规定了
"italic":false
,即不是斜体,覆盖了继承的属性。
效果:
注意只有前半部分斜了。
6. 让我们新增一个附属项:
-
/tellraw @a {"text": "ABC", "color": "red", "italic":true, "extra": [{"text": "DEF", "bold":true, "italic":false}, {"text": "ZZZ"}]}
复制代码
由于新附属项什么都没覆盖,因此完全继承“ABC”的属性。注意附属项之间不会互相影响,“
DEF
”规定的“粗体”,和“不是斜体”不会影响到"
ZZZ
"。
效果:
7. 多举一个例子:
-
/tellraw @a [{"text": "EZ", "bold": true}, {"text": "ZE", "italic": true}]
复制代码
后方的“ZE”在自带了斜体属性的同时还继承了“EZ”的粗体属性。
效果:
本命令与
/tellraw @a {"text": "EZ", "bold": true, "extra":[{"text": "ZE", "italic": true}]}
等价
如果想要ZE只斜体而不粗体,应该额外覆盖掉"bold": true:
-
/tellraw @a [{"text": "EZ", "bold": true}, {"text": "ZE", "italic": true, "bold": false}]
复制代码
效果:
本命令与
/tellraw @a {"text": "EZ", "bold": true, "extra":[{"text": "ZE", "italic": true, "bold": false}]}
等价
8. 套娃:"extra"的附属项可以再套一个"extra":
-
/tellraw @a {"text": "一号", "bold": true, "extra":[{"text": "二号", "color": "green", "extra": [{"text": "三号", "italic": true}] }]}
复制代码
要注意,"extra"的附属项是一个完整的JSON文本组件,所以附属项也可以拥有它自己的“附属项的附属项”。
在上面的命令中,“
一号
”设为粗体,“
二号
”作为一号的附属,在新增了“绿色”这一属性外,还继承了一号的粗体属性。而“
三号”
做为二号的附属项,在继承了二号的属性的同时又新增了一个斜体属性。
效果:
9. 附属项附属于其上级,而非最上级:
-
/tellraw @a {"text": "一号", "bold": true, "extra":[{"text": "二号", "color": "green", "bold": false, "extra": [{"text": "三号", "italic": true}] }]}
复制代码
本命令和上一个命令差不多,区别在于“二号”规定了 "bold": false(不是粗体),覆盖了一号的粗体属性。
由于三号附属于二号而非直接附属于一号,所以它
继承二号的属性,即不是粗体,而不是继承一号的属性,成为粗体
。
效果:
10. 无限套娃:
-
/tellraw @a {"text": "您", "bold": true, "extra":[{"text": "您", "color": "green", "extra": [{"text": "您", "italic": true, "extra": [{"text": "您", "underlined":true, "extra": [{"text": "您", "strikethrough": true}] }]}] }]}
复制代码
套了5个娃,每次新增一个属性。
效果:
11. 如果你有一些盲区,这个例子会帮助你。
注意,我从来没有说过外侧的列表不能和"extra"一起用:
-
/tellraw @a [{"text": "a123", "color": "red"}, {"text":"b456", "color": "blue", "extra": [{"text": "c789","bold": true}]}]
复制代码
我们列表内有两个项目,其中第二个项目拥有附属项。
效果:
|
..
..
..
..
..
看完示例了?
教程还没完,不过你差不多已经度过了最难的部分。
不过在继续之前,我还要再举一个例子:
命令:
-
/tellraw @a [{"text": "你好,", "color": "green", "bold": true}, {"text": "世界!", "color": "blue", "bold": true}]
复制代码
输出为:
3.5 对象
首先恭喜你看完了列表部分。
那么接下来就是最令人兴奋的步骤了。
该如何制作点击事件?
或者,如何点击一行文字就可以执行命令?
本节就是关于这件事的。
你可能知道,JSON文本可以做到,使玩家在点击一段文字后,执行某种互动。
比如,可以点击文字执行命令,或者点击文字打开一个网页。
当然,这也是文字的一项属性,就和"color"或者"bold"一样。
这个项目(键值对)叫做
"clickEvent"
。它的值保存了互动内容的信息。包含是哪一种互动(运行命令还是打开网址),以及互动的信息(要运行的命令或者要打开的网址是什么)。
但你可以注意到,有一点不同的是,"color"只包含一个信息,即颜色。"bold"也只包含一个信息,即是否。但是"clickEvent"包含了两个信息,一个是要执行哪种互动,一个是互动的内容。
这就导致我们无法在单单一个字符串中描述完,我们需要一个对象。
或者说,"clickEvent"的值是一个对象(即一个大括号{ })
OKOK,既然"extra"的值可以是个列表,"clickEvent"的值当然也可以是个对象。
在这个对象内包含了另外两个键值对:
一个是"action",指定了要执行哪种互动。可以是"run_command"执行命令,也可以是"open_url"打开链接。(当然还有别的但是我们暂时只需要这两个来举例)
一个是"value",即要互动的内容。根据"action"的不同,这里应该是你要执行的命令,或者是要打开的链接。
嗯嗯,看上面的解释是不是有一点乱?没关系,下面的例子会帮助你。
看下面的例子:
-
/tellraw @a {"text": "点击切换白天", "clickEvent": {"action": "run_command", "value": "/time set day"}}
复制代码
你应当注意到:
-
我们有写下项目"clickEvent",但是其值并不是字符串也不是布尔值,而是一个对象。
-
对象内有"action"指定了互动内容为"run_command",即执行命令。
-
对象内还有"value"指定了要执行哪一条命令,我们执行的是"/time set day",即“将时间更改为白天(关于本命令请见
本系列第3帖
)”。
-
而整个
{"action": "run_command", "value": "/time set day"}
都是"clickEvent"的值,即“执行命令/time set day”
。
本命令的效果为:
看懂了么?
或者,我们可以再用表格类比一下"clickEvent":
这张图有没有帮助你理解逻辑?
当然。你可以任意更改文字和要执行的命令,比如这样:
-
/tellraw @a {"text": "给我一个苹果谢谢", "color": "yellow", "clickEvent": {"action": "run_command", "value": "/give @s apple 1"}}
复制代码
这回我们把执行的命令变成了"
/give @s apple 1
",即“给自己一个苹果”(关于本命令请见
本系列第13帖
):
效果:
行,我们都举了两个例子了。别愣着别愣着,自己试一试玩一玩再回来接着读。
对于执行命令,你需要注意:
-
请务必在命令前加上斜线"/"。是的,在聊天框中的JSON文本内,执行的命令不加斜线会被视为(1.19之前。之后不再允许以这种方式发送聊天信息)。
【总是加斜线不会有错】
-
执行的命令是以点击的玩家的身份与位置执行的。如果你不理解这句话的意思没关系,我们还没讲到。
那我们继续看下一个例子。
这次我们不再
"run_command"
执行命令,而是
"open_url"
打开链接:
-
/tellraw @a {"text": "需要我帮你百度一下么?", "clickEvent": {"action": "open_url", "value": "https://www.baidu.com"}}
复制代码
我们把"action"从"run_command"执行命令改成了"open_url"打开链接。
此时"value"应该填写要打开的URL。我们填写的是千度的网址。
效果:
这样,就可以打开网页了。
不过要注意网址必须是完整的,比如以https://开头。想要打开百度你需要将"value"写为
"https://www.baidu.com"
而非
"www.baidu.com"
,
后者没有效果。
对于这种格式我就不讲太多了,讲太多反而可能让你混乱。
老规矩,上例子:
1.
-
/tellraw @a {"text": "哦!那看起来很疼", "clickEvent": {"action": "run_command", "value": "/kill @s"}}
复制代码
本命令显示的信息会执行命令“
/kill @s
”,即“杀死自己”。(关于本命令见
系列第1期
)
2.
-
/tellraw @a [{"text": "是男人就上一百层 ", "color": "blue", "clickEvent": {"action": "run_command", "value": "/tp @s ~ ~100 ~"}}, {"text": "加油,我看好你", "italic": true}]
复制代码
效果:
点击本命令输出的文字会执行命令“
/tp @s ~ ~100 ~
”即将自己向上传送100格。
注意"clickEvent"也是一种属性,也会被列表的附属项继承,所以后面的“加油,我看好你”也会触发命令。
(关于tp命令,见
系列教程第2帖
)
3.
-
/tellraw @a {"text": "送你升天", "clickEvent": {"action": "run_command", "value": "/summon tnt ~ ~ ~"}, "color": "red"}
复制代码
点击本命令会在原地召唤一颗tnt。
4.
-
/tellraw @a {"text": "这里是世界上最~~好的命令教程", "clickEvent": {"action": "open_url", "value": "https://www.mcbbs.net/forum.php?mod=viewthread&tid=1249410&page=1#pid23120368"}}
复制代码
运行本命令后,点击文字将会使你打开本教程所在的网址。
|
4. JSON小结与语法树
首先恭喜你,JSON文本小学毕业了。
本教程会送你到中学毕业,所以还没完。
但是后面的内容都是重复的,照着填就好了。主要的格式与逻辑已经探讨完了。
但是在继续之前,让我先对上面说的所有东西做一个小结,免得你模糊或者心里发虚:
-
JSON文本有一个或数个对象(Object)组成,若可以有数个对象,则由列表"[ ]"包含。
-
每个对象包含数个键值对,并以花括弧"{ }"包含。
-
每个键值对,或并列的项目之间以逗号相隔。
-
键值对的格式类似于"key": <value>。
-
值“<value>”有数种不同的类型。
-
可以是字符串,格式为
"key":"value"
,比如
"text": "1a2s3d"
或
"color":"red"
。字符串总是由双引号包围。
-
可以是布尔值,格式为
"key": true
或者
"key": false
。比如
"bold": true
。注意没有双引号。
-
可以是数值,格式为"key":<数值>,没有双引号。但JSON文本基本没有使用数值,这里不讨论。
-
可以是一个对象,<value>应该是一个由{}开头与结尾的完整对象。比如
"clickEvent": {"action": "open_url","value":"https://www.example.com"}
-
可以是列表。<value>应该是一个完整的列表,内含数个并列的项目。在JSON文本中,只使用并列对象,比如
"extra":[{"text": "a"}, {"text": "b"}]
-
若有重复的项目,后面的覆盖前面的。
以上其实就是上面讲的所有格式。
但注意是“格式”。想要知道哪里该填什么,请看下米娜。
你应该看得懂,下面描述了目前讲过的JSON文本可包含的所有键值对及其结构:
JSON文本可能是一个列表,列表内包含了一个或数个对象。然而不是在所有的地方都允许在最外侧使用列表。在tellraw中当列表内只有一个对象时,方括号[]可以省略,然而在有些地方最外侧列表是必须的。
[
{
一个对象:
—
"text":
字符串
要显示文字
必填
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是"run_command"执行命令,或"open_ur"打开链接
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行的命令或是打开的链接
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{ ... }
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
}
]
上面的语法书展示了目前为止所有提到过的属性。
所以,比如当你想要写一行红色的“Dahesor很可靠”时,只需要看:啊,首先我们需要{,然后要写必填的"text",然后想要红色,就是"color",最后}结尾。
你的命令就写出来了:
-
/tellraw @a {"text": "Dahesor很可靠", "color": "red"}
复制代码
怎么样?上面的语法树会不会看?
请把它弄懂,下面都是这种东西。
我们要加速了——
5. JSON文本完整格式
在上一节,你看到了一个语法树。
首先,你要知道的是,这个语法书并不完整。因为上面我都是在讲格式,只选择了那些易于举例的属性来讲。
但JSON文本还可以有很多很多属性我还没提到,它们有着相同的格式,只是影响的属性不同。(就像"bold"和"italic"的区别)
所以,只要你理解了格式且看得懂语法树,那么就没有难度了。
跟我领略一下MC无尽可能性的一小部分吧:
5.1 显示文字(text)完整语法树:
{
一个对象:
—
"text":
字符串
要显示的文字
必填
通用格式:
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"font":
字符串
文字的字体。内置有"default"(默认)"alt"(附魔台)"uniform"
(Unicode)
—
"
insertion":
字符串
按住Shift并点击文字,会把本项包含的信息插入到聊天框中。
仅生效于聊天框
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
open_url"
打开链接
•
"run_command
"
执行命令
•
"
suggest_command"
不直接执行命令,而是“建议”命令
•
"
change_page"
仅在命令书中生效:
跳转到指定页码
•
"
copy_to_clipboard
"
复制"value"的内容
•
"
open_file
"
打开计算机上的文件。由于安全问题
不可以由玩家使用
。
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行或建议的命令,
打开的链接,要跳转的页码,
要复制的内容,或文件路径。
— —
}
—
"hoverEvent":
对象
悬停互动事件,将鼠标悬停到文字上可看到信息
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
show_text"
显示另一串JSON
•
"
show_item"
显示一个物品的信息
•
"
show_entity"
显示一个实体的信息
— — —
"contents":
对象
/
对象
列表
要显示的内容。根据"action"的不同"contents"也会变化。
若"action"是"show_text","contents"可以为列表,其他两种都为对象
如果"action"为"show_text":
— — — —
[
— — — — —
{
...
}
一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。
— — — —
]
如果"action"为"show_item":
— — — —
{
— — — —
—
"
id":
字符串
物品的ID
必填
— — — —
—
"
count":
数值
物品的数量
— — — —
—
"
tag":
字符串
物品的NBT
— — — —
}
如果"action"为"show_entity":
— — — —
{
— — — — —
"
type":
字符串
想要显示的实体的种类,应为一个实体ID
必填
— — — —
—
"name
":
对象
要显示的实体的
名字,若不规定显示为原名(比如“僵尸”)
— — — — — —
{
...
}
一个JSON文本对象,不能是列表
— — — —
—
"id
":
字符串
显示的UUID,不需要真实存在
必填
— — — —
}
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{
...
}
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
}
在看完上面的语法树后,你有没有看懂?
hoverEvent和"contents"有没有把你搞糟?
可能有可能没有。
没关系,下面是示例以及各种互动的效果图:
在开始实例前,需要注意,虽然下面的示例为了简洁而简化,但上面提到的所有键值对都可以自由选用或是套娃,除非提到不可以。
注意所有除了"text"和"extra"的属性都会继承给它的附属项。
1. 我们规定一下上面的"font",即字体
-
/tellraw @a {"text":"abcdefghijklmn", "font":"alt"}
复制代码
我们改变了字体为"alt",即附魔台上那种宇宙文。
效果:
2. 插入(insertion)效果图
-
/tellraw @a {"text":"???", "insertion":"偶也!"}
复制代码
按shift并点击文字会插入“偶也!”
效果:
3. 效果图:点击事件/"suggest_command"
-
/tellraw @a {"text":"运行这条命令可以调整至白天", "clickEvent":{"action":"suggest_command", "value": "/time set day"}}
复制代码
效果:
3. 示例:点击事件 / "copy_to_clipboard"
-
/tellraw @a {"text":"谁最NB?", "clickEvent":{"action":"copy_to_clipboard", "value": "DahesorNB!"}}
复制代码
本名令会在点击后将“DahesorNB!复制到剪切板”
Ctrl+V可以直接粘贴。
同为点击事件的"change_page"会在下一帖讲。
"open_file"你使用不了的,不用在意。
4. 示例:悬浮事件hoverEvent / 显示文字"show_text"
-
/tellraw @a {"text":"谁最NB?", "hoverEvent":{"action":"show_text", "contents": [{"text": "DahesorNB!", "color": "red"}]}}
复制代码
我们规定了悬浮事件为显示文字,内容为[{"text": "DahesorNB!", "color": "red"}],即“
DahesorNB!
”
"contents"就是在hoverEvent的对象里又套了一个列表,里面有数个对象。
效果:
你要注意,在不能将鼠标悬停于文字上的地方"hoverEvent"没有用,比如,你不能再"show_text"显示的文字里再加"hoverEvent"。
5. 示例:悬浮事件hoverEvent / 显示物品"show_item"
-
/tellraw @a {"text":"谁最NB?", "hoverEvent":{"action":"show_item", "contents": {"id": "minecraft:stone"}}}
复制代码
这次我们换成了“show_item”,要显示的物品为"minecraft:stone",即“石头”。
效果:
在上面的语法树中还提到有"count"和"tag"。
"count"的类型写的是“数值”。不用管也不用用,我没发现有什么用,
而"tag"很容易涉及转义问题,我们会在下一帖详细讲。
6. 示例:悬浮事件hoverEvent / 显示实体"show_entity"
这个说实话很没用。
如果你知道UUID是什么也就算了,但若你不知道完全没有必要看本实例,真的没用:
-
/tellraw @a {"text":"谁最NB?", "hoverEvent":{"action":"show_entity", "contents": {"id": "1-1-1-1-1", "type": "zombie"}}}
复制代码
我们指定种类为"zombie",即僵尸,并随便写了一个UUID
效果:
7. 超级复杂:
-
/tellraw @a [{"text": "商人:", "color":"green", "bold":true},{"text": " 不会坏的铁剑!", "bold":false, "hoverEvent":{"action": "show_item", "contents": {"id": "iron_sword", "tag": "{Unbreakable:1b}"}}, "clickEvent": {"action": "run_command", "value": "/say 我没钱"}, "extra": [{"text": " 点击购买", "color":"yellow"}]}]
复制代码
能看懂是什么意思么?看不懂的话去游戏试一下。注意这个命令太长聊天框装不下,必须使用命令方块执行。
|
5.2 显示分数完整语法树:
你以为结束了?
没!
Java版的JSON文本十分强大!它不止可以显示文本,还可以显示分数!
注意!你需要知道计分板这个东西才可以读懂下面的内容。
记分板在
本系列第5帖
讨论过。如果你不知道的话也没关系,这里可以直接跳过,对后续没有任何影响。
想要显示一个分数,格式大体上和原来的一样。只是"text"被换了一下而已。其他的属性都是公用的:
{
一个对象:
—
"score":
对象
显示一个分数
必填
— —
{
— — —
"objective":
字符串
要显示的记分板ID
必填
— — —
"name":
字符串
分数的所属者,可以是ID,选择器,或"*"
只能指定一个实体
必填
— — —
"value"
:
字符串
若指定了本项,无论实际分数多少都显示为本分数
— —
}
通用格式:
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"font":
字符串
文字的字体。内置有"default"(默认)"alt"(附魔台
)"uniform"
(Unicode)
—
"
insertion":
字符串
按住Shift并点击文字,会把本项包含的信息插入到聊天框中。
仅生效于聊天框
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
open_url"
打开链接
•
"run_command
"
执行命令
•
"
suggest_command"
不直接执行命令,而是“建议”命令
•
"
change_page"
仅在命令书中生效:
跳转到指定页码
•
"
copy_to_clipboard
"
复制"value"的内容
•
"
open_file
"
打开计算机上的文件。由于安全问题
不可以由玩家使用
。
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行或建议的命令,
打开的链接,要跳转的页码,
要复制的内容,或文件路径。
— —
}
—
"hoverEvent":
对象
悬停互动事件,将鼠标悬停到文字上可看到信息
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
show_text"
显示另一串JSON
•
"
show_item"
显示一个物品的信息
•
"
show_entity"
显示一个实体的信息
— — —
"contents":
对象
/
对象
列表
要显示的内容。根据"action"的不同"contents"也会变化。
若"action"是"show_text","contents"可以为列表,其他两种都为对象
如果"action"为"show_text":
— — — —
[
— — — — —
{
...
}
一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。
— — — —
]
如果"action"为"show_item":
— — — —
{
— — — —
—
"
id":
字符串
物品的I
D
必填
— — — —
—
"
count":
数值
物品的数量
— — — —
—
"
tag":
字符串
物品的NBT
— — — —
}
如果"action"为"show_entity":
— — — —
{
— — — — —
"
type":
字符串
想要显示的实体的种类,应为一个实体ID
必填
— — — —
—
"name
":
对象
要显示的实体的
名字,若不规定显示为原名(比如“僵尸”)
— — — — — —
{
...
}
一个JSON文本对象,不能是列表
— — — —
—
"id
":
字符串
显示的UUID,不需要真实存在
必填
— — — —
}
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{
...
}
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
|
}
本命令可以显示一个分数,换句话说,根据分数的不同,显示的东西也有所不同。
比如命令:
-
/tellraw @a {"score":{"objective":"data", "name": "test"}}
复制代码
本命令的效果是,显示test在data上的分数,所以当test有1分时运行本命令就会显示“1”,有23分时运行就会显示“23”。
注意空分什么都不会显示,而不是0。
如果把"name"指定为*,则所有玩家会看到自己的分数,比如:
-
/tellraw @a {"score":{"objective":"data", "name": "*"}}
复制代码
运行后,如果我在data记分板上有1分我就会看到1,但是如果你有10分,你就会看到10。
注意这个功能不适用于告示牌或者类似的地方,因为有可能有很多人同时盯着告示牌。
(告示牌又不会薛定谔的猫)
哦还有,你可以在上面看到有一个"value",这玩意啥用没有,至少对你啥用没有。
示例:
1. 假设我在记分板"death"上有10分:
-
/tellraw @a {"score":{"objective":"death", "name": "@p"}}
复制代码
这条命令就会显示“10”。
当然,你可以用列表将分数与文字结合:
-
/tellraw @a [{"text": "Dahesor的死亡次数是:", "color": "red"}, {"score":{"objective":"death", "name": "@p"}}]
复制代码
效果:
注意:分数一次只能显示一个目标的,所以选择器只能是@p,@r,@s,或者是添加了限制条件"limit=1"(这部分在
系列第6帖
提到)
5.3 显示按键完整语法树:
当然,JSON文本还没完。
它除了可以显示固定的文字,可变的分数外,还可以显示绑定键。
比如你写了一个小游戏,需要玩家按丢弃键“Q”释放技能,但问题是有些玩家的丢弃键不是"Q",这是下面的内容就派上用场了:
{
一个对象:
—
"keybind":
字符串
应该使用键位标识 (
见下列表
) 符指定一项操作,
将显示当前绑定按键。
如“key.inventory”为打开背包,默认键位下会显示为“e”。
必填
通用格式:
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"font":
字符串
文字的字体。内置有"default"(默认)"alt"(附魔台
)"uniform"
(Unicode)
—
"
insertion":
字符串
按住Shift并点击文字,会把本项包含的信息插入到聊天框中。
仅生效于聊天框
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
open_url"
打开链接
•
"run_command
"
执行命令
•
"
suggest_command"
不直接执行命令,而是“建议”命令
•
"
change_page"
仅在命令书中生效:
跳转到指定页码
•
"
copy_to_clipboard
"
复制"value"的内容
•
"
open_file
"
打开计算机上的文件。由于安全问题
不可以由玩家使用
。
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行或建议的命令,
打开的链接,要跳转的页码,
要复制的内容,或文件路径。
— —
}
—
"hoverEvent":
对象
悬停互动事件,将鼠标悬停到文字上可看到信息
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
show_text"
显示另一串JSON
•
"
show_item"
显示一个物品的信息
•
"
show_entity"
显示一个实体的信息
— — —
"contents":
对象
/
对象
列表
要显示的内容。根据"action"的不同"contents"也会变化。
若"action"是"show_text","contents"可以为列表,其他两种都为对象
如果"action"为"show_text":
— — — —
[
— — — — —
{
...
}
一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。
— — — —
]
如果"action"为"show_item":
— — — —
{
— — — —
—
"
id":
字符串
物品的I
D
必填
— — — —
—
"
count":
数值
物品的数量
— — — —
—
"
tag":
字符串
物品的NBT
— — — —
}
如果"action"为"show_entity":
— — — —
{
— — — — —
"
type":
字符串
想要显示的实体的种类,应为一个实体ID
必填
— — — —
—
"name
":
对象
要显示的实体的
名字,若不规定显示为原名(比如“僵尸”)
— — — — — —
{
...
}
一个JSON文本对象,不能是列表
— — — —
—
"id
":
字符串
显示的UUID,不需要真实存在
必填
— — — —
}
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{
...
}
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
|
}
上面的格式允许在玩家设置了不同按键时可以看到不同的内容。
比如:
/tellraw @a {"keybind": "key.inventory"}
"key.inventory"是打开背包按键的id,默认是E,所以上面的命令正常会看到“e”,但如果你设置的"R"打开背包,那么你就会看到"r"。
按键id列表:
注意下表不一定准确或及时,请以
Wiki本页面
为准
最后更新:2021/10/1,版本Java1.17.1
默认键位 / 游戏内设置名称 / id
空格 跳跃 key.jump
左Shift 潜行 key.sneak
左Control 疾跑 key.sprint
A 向左移动 key.left
D 向右移动 key.right
S 向后移动 key.back
W 向前移动 key.forward
左键 攻击/摧毁 key.attack
中键 选取方块 key.pickItem
右键 使用物品/放置方块 key.use
Q 丢弃所选物品 key.drop
1 - 9 快捷栏 key.hotbar.1 - key.hotbar.9
E 开启/关闭物品栏 key.inventory
F 与副手交换物品 key.swapOffhand
X 加载快捷栏 key.loadToolbarActivator
C 保存快捷栏 key.saveToolbarActivator
Tab 玩家列表 key.playerlist
T 打开聊天栏 key.chat
/ 输入命令 key.command
L 进度 key.advancements
无 高亮玩家(旁观者) key.spectatorOutlines
F2 截图 key.screenshot
无 切换电影视角 key.smoothCamera
F11 全屏显示切换 key.fullscreen
F5 切换视角 key.togglePerspective
|
实例:
-
/tellraw @a {"keybind":"key.chat"}
复制代码
key.chat是聊天键,默认为T。
所以在使用默认设置的玩家处,会看到"t"。
当然,你也可以使用列表(或"extra")将其与文本或分数结合:
-
/tellraw @a [{"text": "按【", "color": "blue"}, {"keybind":"key.drop"}, {"text": "】释放剑气"}]
复制代码
"key.drop"是丢弃键。
(默认)效果:
5.4 显示实体名完整语法树:
当我告诉你JSON文本还有更多的时候,你大概已经不会再惊讶了。
下面的内容包含了如何显示可变的实体名,比如当Dahesor靠近时显示“Dahesor成功了!”,而当Dianliang233靠近时同一条命令则会显示“Dianliang233成功了”:
{
一个对象:
—
"selector":
字符串
要显示的实体,应为玩家ID,选择器,或UUID
必填
—
"separator":
对象
若选择了多个NBT,不同的NBT之间将使用分隔符分隔
— —
{
...
}
一串完整的JSON文本,
指定了分隔符,若不指定默认为灰色逗号
通用格式:
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"font":
字符串
文字的字体。内置有"default"(默认)"alt"(附魔台
)"uniform"
(Unicode),
—
"
insertion":
字符串
按住Shift并点击文字,会把本项包含的信息插入到聊天框中。
仅生效于聊天框
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
open_url"
打开链接
•
"run_command
" 执行命令
•
"
suggest_command"
不直接执行命令,而是“建议”命令
•
"
change_page"
仅在命令书中生效:
跳转到指定页码
•
"
copy_to_clipboard
"
复制"value"的内容
•
"
open_file
"
打开计算机上的文件。由于安全问题
不可以由玩家使用
。
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行或建议的命令,
打开的链接,要跳转的页码,
要复制的内容,或文件路径。
— —
}
—
"hoverEvent":
对象
悬停互动事件,将鼠标悬停到文字上可看到信息
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
show_text"
显示另一串JSON
•
"
show_item"
显示一个物品的信息
•
"
show_entity"
显示一个实体的信息
— — —
"contents":
对象
/
对象
列表
要显示的内容。根据"action"的不同"contents"也会变化。
若"action"是"show_text","contents"可以为列表,其他两种都为对象
如果"action"为"show_text":
— — — —
[
— — — — —
{
...
}
一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。
— — — —
]
如果"action"为"show_item":
— — — —
{
— — — —
—
"
id":
字符串
物品的I
D
必填
— — — —
—
"
count":
数值
物品的数量
— — — —
—
"
tag":
字符串
物品的NBT
— — — —
}
如果"action"为"show_entity":
— — — —
{
— — — — —
"
type":
字符串
想要显示的实体的种类,应为一个实体ID
必填
— — — —
—
"name
":
对象
要显示的实体的
名字,若不规定显示为原名(比如“僵尸”)
— — — — — —
{
...
}
一个JSON文本对象,不能是列表
— — — —
—
"id
":
字符串
显示的UUID,不需要真实存在
必填
— — — —
}
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{
...
}
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
|
}
示例:
-
/tellraw @a {"selector": "@p"}
复制代码
会显示你的名字。
-
/tellraw @a {"selector": "@a"}
复制代码
会显示所有玩家的名字。
如果世界中有多名玩家,则名字之间会用灰色的逗号相隔,比如:
这个灰色逗号是默认分隔符。
这个分割符可以像下面一样修改:
-
/tellraw @a {"selector": "@a", "separator": {"text": " | ", "bold": true}}
复制代码
我们将分隔符改成了
{"text": " | ", "bold": true}
,即“
|
”
所以现在效果变成了:
注意分隔符是一个完整的JSON,所以你可以用任何JSON来当分隔符。
比如拿一个分数:
-
/tellraw @a {"selector": "@a", "separator": {"score": {"objective": "example", "name": "@s"}}}
复制代码
或者拿一个按键:
-
/tellraw @a {"selector": "@a", "separator": {"keybind": "key.use", "color": "red"}}
复制代码
甚至,拿另一个实体名:
-
/tellraw @a {"selector": "@e", "separator": {"selector": "@e"}}
复制代码
我真是个魔鬼:
-
/tellraw @a {"selector": "@e", "separator": {"selector": "@e", "separator": {"selector": "@e", "separator": {"selector": "@e"}}}}
复制代码
5.5 显示NBT完整语法树:
你还可以显示NBT,不过如果你不知道什么是NBT的话可以跳过此段,或者去看本系列教程
第X
和
第12帖
。
{
一个对象:
—
"entity":
字符串
要显示的NBT所属的实体,应为玩家ID,选择器,或UUID
不应与或"block"或"storage"同时存在
—
"block":
字符串
要显示的NBT所属的方块坐标
不应与"entity"或"storage"同时存在
—
"storage":
字符串
要
显示的存储NBT
不应与"entity"或"block"同时存在
—
"nbt":
字符串
显示的NBT路径
必填
—
"interpret":
布尔值
若设为真,将尝试把获取到的nbt当成一个JSON文本解析,
若成功将直接输出结果而非原始代码
—
"separator":
对象
若选择了多个NBT,不同的NBT之间将使用分隔符分隔
— —
{
...
}
一串完整的JSON文本,
指定了分隔符,若不指定默认为灰色逗号
通用格式:
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"font":
字符串
文字的字体。内置有"default"(默认)"alt"(附魔台
)"uniform"
(Unicode)
—
"
insertion":
字符串
按住Shift并点击文字,会把本项包含的信息插入到聊天框中。
仅生效于聊天框
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
open_url"
打开链接
•
"run_command
"
执行命令
•
"
suggest_command"
不直接执行命令,而是“建议”命令
•
"
change_page"
仅在命令书中生效:
跳转到指定页码
•
"
copy_to_clipboard
"
复制"value"的内容
•
"
open_file
"
打开计算机上的文件。由于安全问题
不可以由玩家使用
。
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行或建议的命令,
打开的链接,要跳转的页码,
要复制的内容,或文件路径。
— —
}
—
"hoverEvent":
对象
悬停互动事件,将鼠标悬停到文字上可看到信息
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
show_text"
显示另一串JSON
•
"
show_item"
显示一个物品的信息
•
"
show_entity"
显示一个实体的信息
— — —
"contents":
对象
/
对象
列表
要显示的内容。根据"action"的不同"contents"也会变化。
若"action"是"show_text","contents"可以为列表,其他两种都为对象
如果"action"为"show_text":
— — — —
[
— — — — —
{
...
}
一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。
— — — —
]
如果"action"为"show_item":
— — — —
{
— — — —
—
"
id":
字符串
物品的I
D
必填
— — — —
—
"
count":
数值
物品的数量
— — — —
—
"
tag":
字符串
物品的NBT
— — — —
}
如果"action"为"show_entity":
— — — —
{
— — — — —
"
type":
字符串
想要显示的实体的种类,应为一个实体ID
必填
— — — —
—
"name
":
对象
要显示的实体的
名字,若不规定显示为原名(比如“僵尸”)
— — — — — —
{
...
}
一个JSON文本对象,不能是列表
— — — —
—
"id
":
字符串
显示的UUID,不需要真实存在
必填
— — — —
}
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{
...
}
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
|
}
因为本文没有要涉及到NBT的意思,所以补肾说说了。关于NBT可以去看系列第11(X)篇。
不过,如果你对NBT了解足够的话,上面的语法树应该足够用了
5.6 显示可翻译文字完整语法树:
语言是个令人类很头疼的东西。
但是JSON文本的这一项功能被叫做“翻译文本”,简单来说,就是只要你输入一串游戏自带文字的id“本地化键名”,游戏就会自行将其翻译成阅读这串文字的玩家所选择的语言。
比如,
"item.minecraft.diamond_sword"是钻石剑的本地化键名,所以当你使用本功能翻译后,使用简体中文的玩家会看到"钻石剑",繁体中文玩家会看到"鑽石劍",英文玩家则会看到"Diamond Sword",以此类推。
{
一个对象:
—
"translate":
字符串
一个包含翻译标识符的字符串,将以玩家的语言显示对应文字
必填
—
"with":
对象
列表
为"translate"中指定的参数填上对应的文本
— —
[
— —
—
{
...
}
一串完整的JSON文本
— —
]
通用格式:
—
"color":
字符串
文字的颜色,可以为十六种标准色或是"#<hex>"
—
"bold":
布尔值
是否为粗体
—
"italic":
布尔值
是否为斜体
—
"
underlined
":
布尔值
是否带有下划线
—
"strikethrough"
:
布尔值
是否带有删除线
—
"obfuscated":
布尔值
是否为乱码
—
"font":
字符串
文字的字体。内置有"default"(默认)"alt"(附魔台
)"uniform"
(Unicode)
—
"
insertion":
字符串
按住Shift并点击文字,会把本项包含的信息插入到聊天框中。
仅生效于聊天框
—
"clickEvent":
对象
点击互动事件
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
open_url"
打开链接
•
"run_command
"
执行命令
•
"
suggest_command"
不直接执行命令,而是“建议”命令
•
"
change_page"
仅在命令书中生效:
跳转到指定页码
•
"
copy_to_clipboard
"
复制"value"的内容
•
"
open_file
"
打开计算机上的文件。由于安全问题
不可以由玩家使用
。
— — —
"value":
字符串
互动的内容,根据互动方式不同应该是执行或建议的命令,
打开的链接,要跳转的页码,
要复制的内容,或文件路径。
— —
}
—
"hoverEvent":
对象
悬停互动事件,将鼠标悬停到文字上可看到信息
— —
{
— — —
"action":
字符串
互动的方式,可以是:
•
"
show_text"
显示另一串JSON
•
"
show_item"
显示一个物品的信息
•
"
show_entity"
显示一个实体的信息
— — —
"contents":
对象
/
对象
列表
要显示的内容。根据"action"的不同"contents"也会变化。
若"action"是"show_text","contents"可以为列表,其他两种都为对象
如果"action"为"show_text":
— — — —
[
— — — — —
{
...
}
一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。
— — — —
]
如果"action"为"show_item":
— — — —
{
— — — —
—
"
id":
字符串
物品的I
D
必填
— — — —
—
"
count":
数值
物品的数量
— — — —
—
"
tag":
字符串
物品的NBT
— — — —
}
如果"action"为"show_entity":
— — — —
{
— — — — —
"
type":
字符串
想要显示的实体的种类,应为一个实体ID
必填
— — — —
—
"name
":
对象
要显示的实体的
名字,若不规定显示为原名(比如“僵尸”)
— — — — — —
{
...
}
一个JSON文本对象,不能是列表
— — — —
—
"id
":
字符串
显示的UUID,不需要真实存在
必填
— — — —
}
— —
}
—
"extra":
对象
列表
对象的附属项
— —
[
— — —
{
...
}
列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定
— —
]
|
}
使用translate可以使不同语言的玩家看到不同的东西:
-
/tellraw @a {"translate": "item.minecraft.apple"}
复制代码
如果你的语言为中文就会显示“苹果”但如果是英文会显示“apple”,文言文则会显示"林檎"简单来讲就是游戏的每一条文本都是以翻译键名(本地化键名)的形式存在的。比如“苹果”是“item.minecraft.apple”。当真的要显示的时候,游戏会根据玩家的语言调取该翻译键名在这个语言中的文本,也就是“苹果”(简体中文)。
这个是涉及资源包的问题也不想深入地说。不过,有一些翻译文本还需要“变量”。比如说当你执行/kill命令时,游戏会返回给你杀死了几个实体。那么游戏总不可能存储“杀死了1个实体”,“杀死了2个实体”,“杀死了3个实体”,“杀死了4个实体”……然后给每一个都配置一个翻译键名吧?
所以游戏只存“杀死了%s个实体”。这里%s是变量,可以为任何内容。
在我们使用JSON的时候,可以使用with来指定变量
以死亡信息为例:
-
/tellraw @a {"translate": "death.attack.magic"}
复制代码
会显示“被魔法杀死了”,因为我们没指定变量所以玩家名留空
但是
-
/tellraw @a {"translate": "death.attack.magic", "with":[{"text":"Dahesor"}]}
复制代码
则会显示“Dahesor被魔法杀死了”
当然,配合选择器更好:
-
/tellraw @a {"translate": "death.attack.magic", "with":[{"selector":"@p"}]}
复制代码
6. 终幕
恭喜JSON文本中学毕业。
坏消息是,我们还没结束。
好消息是,那是下期教程的事了!
我可以偷偷吐露下下期讨论什么。
来,尝试将下面的东西用JSON文本输出:
Dahesor最喜欢的符号就是双引号"和反斜线\了!
呵呵。(捂脸)
下期我们来就来说,JSON文本在nbt中的应用,与转义符号
后记
结束了,结束了。
我写了一个月的JSON。
本来上周已经写完了,但是对第3部分严重不满意,看似写很多实际上啥也没有,就推倒重写了,也正好赶上10.1。
说真的,我为自己写完了本教程感到自豪。若我帮助了你,我会更自豪的。
下一期教程是关于JSON在NBT中的应用,与转义相关的事情。
那么,就下期再见了。本文剩下的部分是包含了所有提及命令的涉及命令列表,与本系列教程目录。
2022/12:啊,不过作者决定跳过下一期,先把/execute解决
啊等等,先别走。
本文有帮到你么?
没有的话,我深感抱歉。
如果有的话:
如果你的用户组有权限评分:
-
那么请给我人气,作为支持
-
金粒也行,我来者不拒
-
你喜欢贡献么?真巧,我也喜欢
-
啥?今天限额用完了?先点个赞,明天补?
-
啊啊,是大佬啊,看我多可爱(bushi)
如果你没权限评分:
没关系,上面的评分都是虚的,我最需要的是收藏,毕竟评分只是多少人认可我,但收藏是我帮了多少人
以上。
附录
涉及命令列表:
这里列出了所有出现的命令及其效果:
-
/say 那个ID是Dahesor的人的外表十分出众
复制代码
-
/tellraw @a "Dahesor的外貌十分出众"
复制代码
-
/tellraw @a {"text": "Dahesor的外貌十分出众", "color": "blue"}
复制代码
-
/tellraw @a {"text": "祝你好运!", "color": "red"}
复制代码
-
/tellraw @a {"text": "MCyyds", "color": "green"}
复制代码
-
/tellraw @a {"text":"ABCDEFG", "color":"dark_blue"}
复制代码
-
/tellraw @a {"text":"HW!", "color":"gold"}
复制代码
-
/tellraw @a {"text":"a1234567"}
复制代码
-
/tellraw @a {"text":"HEX颜色无所不能!", "color":"#4169E1"}
复制代码
-
/tellraw @a {"text":"一串文字", "color": "blue", "italic": true}
复制代码
-
/tellraw @a {"text":"一串文字", "color": "blue", "italic": false}
复制代码
或
-
/tellraw @a {"text":"一串文字", "color": "blue"}
复制代码
-
/tellraw @a {"text": "这什么玩意乱糟糟的", "color": "red", "bold": true,"italic": true, "strikethrough": true, "obfuscated": false, "underlined": true}
复制代码
懒了,不写了,自己翻。
|
格式代码:当你在问答版需要给别人一个JSON文本的格式时,可以直接把下面的代码粘上去,会生成5.1 显示文字(text)完整语法树:
-
-
[quote][b][size=3]{[/size][/b][backcolor=initial] [size=2][color=#696969]一个对象:[/color][/size][/backcolor]
-
— [color=#000000][b][size=3]"text":[/size][/b] [/color] [size=2][b][color=#2e8b57]字符串[/color][/b] [color=#808080]要显示的文字 [/color][/size][size=2][color=#000000][b]必填[/b][/color][/size]
-
[i]通用格式:[/i]
-
— [b][size=3][color=#000000]"color":[/color][/size][/b] [b][color=#2e8b57]字符串[/color][/b][size=2] [color=#696969]文字的颜色,可以为十六种标准色或是"#<hex>"[/color][/size]
-
— [b][size=3][color=#000000]"bold":[/color][/size][/b] [size=2][color=#0000ff][b]布尔值[/b][/color] [color=#696969]是否为粗体[/color][/size]
-
— [b][size=3][color=#000000]"italic":[/color][/size][/b] [b][size=2][color=#0000ff]布尔值[/color][/size][/b][size=2] [color=#696969]是否为斜体[/color][/size]
-
— [b][size=3]"[color=#000000]underlined[/color]":[/size][/b] [size=2][color=#0000ff] [b]布尔值[/b][/color] [color=#696969]是否带有下划线[/color][/size]
-
— [b][size=3][color=#000000]"strikethrough"[/color]: [/size][/b] [b][size=2][color=#0000ff]布尔值[/color][/size][/b][size=2] [color=#696969]是否带有删除线[/color][/size]
-
— [color=#000000][b][size=3]"obfuscated":[/size][/b] [/color] [b][size=2][color=#0000ff]布尔值[/color][/size][/b][size=2][color=#0000ff] [/color] [color=#696969]是否为乱码[/color][/size]
-
— [b][size=3][color=#000000]"font": [/color][/size][/b][b][size=2][color=#2e8b57]字符串[/color][/size][/b][b][size=3][color=#000000] [/color][/size][/b][size=2][color=#696969][backcolor=initial]文字的字体。内置有"default"(默认)"alt"(附魔台)"uniform"(Unicode)
-
[/backcolor][/color][/size]— [b][size=3][color=#000000]"[/color][/size][/b][b][size=3][color=#000000]insertion": [/color][/size][/b][b][color=#2e8b57][size=2]字符串[/size] [/color][/b][size=2][color=#696969]按住Shift并点击文字,会把本项包含的信息插入到聊天框中。[/color][/size][size=2][color=#696969]仅生效于聊天框[/color][/size]
-
— [b][size=3][color=#000000]"clickEvent":[/color][/size][/b] [size=2][b][color=#ff0000]对象 [/color][/b] [color=#696969]点击互动事件[/color][/size]
-
— — [b][size=3]{[/size][/b]
-
— — — [color=#000000][b][size=3]"action": [/size][/b][/color] [b][color=#2e8b57]字符串[/color][/b][size=2] [color=#696969]互动的方式,可以是: [/color][/size][color=#696969]
-
[size=2] [/size][size=2]•[/size][size=2][backcolor=initial] "[/backcolor][/size][backcolor=initial][size=2]open_url" [/size][/backcolor][/color][color=#696969][size=2]打开链接[/size][/color]
-
[color=#696969][size=2] [/size][/color][color=#696969][backcolor=initial][size=2] [/size][size=2]•[/size][backcolor=initial][size=2] [/size][/backcolor][backcolor=initial][size=2]"run_command[/size][/backcolor][backcolor=initial][size=2]" [/size][/backcolor][/backcolor][/color][color=#696969][backcolor=initial][size=2]执行命令[/size][/backcolor][/color]
-
[color=#696969][size=2] •[backcolor=initial] "[/backcolor][backcolor=initial]suggest_command" [/backcolor]不直接执行命令,而是“建议”命令[/size]
-
[size=2] [/size][size=2]•[/size][backcolor=initial][size=2] "[/size][/backcolor][size=2][backcolor=initial]change_page" [/backcolor][/size][size=2][b]仅在命令书中生效:[/b]跳转到指定页码[/size]
-
[size=2] [/size][size=2]•[/size][backcolor=initial][size=2] "[/size][/backcolor][size=2][backcolor=initial]copy_to_clipboard[/backcolor][/size][backcolor=initial][size=2]" [/size][/backcolor][size=2]复制"value"的内容[/size]
-
[size=2] [/size][size=2]•[/size][backcolor=initial][size=2] "[/size][/backcolor][size=2][backcolor=initial]open_file[/backcolor][/size][backcolor=initial][size=2]" [/size][/backcolor][size=2]打开计算机上的文件。由于安全问题[b]不可以由玩家使用[/b]。[/size][/color]
-
— — — [b][size=3][color=#000000]"value":[/color] [/size][/b] [b][color=#2e8b57]字符串[/color][/b][size=2] [color=#696969]互动的内容,根据互动方式不同应该是执行或建议的命令,[/color][/size][color=#696969][size=2] [/size][/color][size=2][color=#696969]打开的链接,要跳转的页码,[/color][/size][size=2][color=#696969]要复制的内容,或文件路径。 [/color][/size]
-
— — [b][size=3]}[/size][/b]
-
— [b][size=3][color=#000000]"hoverEvent":[/color][/size][/b] [size=2][b][color=#ff0000]对象 [/color][/b] [/size][size=2][color=#696969]悬停互动事件,将鼠标悬停到文字上可看到信息[/color][/size]
-
— — [b][size=3]{[/size][/b]
-
— — — [color=#000000][b][size=3]"action": [/size][/b][/color] [b][color=#2e8b57]字符串[/color][/b][size=2] [color=#696969]互动的方式,可以是: [/color][/size][color=#696969]
-
[size=2] [/size][size=2]•[/size][size=2][backcolor=initial] "[/backcolor][/size][backcolor=initial][size=2]show_text" [/size][/backcolor][size=2]显示另一串JSON[/size]
-
[size=2] [/size][size=2]•[/size][backcolor=initial][size=2] [/size][/backcolor][backcolor=initial][size=2]"[/size][/backcolor][backcolor=initial][size=2]show_item" [/size][/backcolor][size=2]显示一个物品的信息[/size]
-
[size=2] •[backcolor=initial] "[/backcolor][backcolor=initial]show_entity" [/backcolor][/size][/color][size=2][color=#696969]显示一个实体的信息[/color][/size]
-
— — — [size=3][color=#000000][b]"contents":[/b][/color] [/size] [b][color=#ff0000]对象[/color][/b][size=2] / [/size][b][color=#ff0000]对象[/color][color=#800080]列表[/color][/b][size=2][backcolor=initial] [/backcolor][/size][size=2][color=#696969][backcolor=initial]要显示的内容。根据"action"的不同"contents"也会变化。[/backcolor][/color][/size]
-
[size=2][color=#696969][backcolor=initial] [u][b] 若"action"是"show_text","contents"可以为列表,其他两种都为对象[/b][/u][/backcolor][/color][/size]
-
[size=2][color=#696969] 如果"action"为"show_text": [/color][/size]
-
— — — — [b][size=3][[/size][/b]
-
— — — — —[backcolor=initial] [/backcolor][b][size=3]{ [color=#000000]...[/color] } [/size][/b][size=2][color=#696969]一串完整的JSON文本,就像你在"extra"中做的那样。可以不用列表而用对象。[/color][/size]
-
— — — —[b][size=3] [/size][/b] [b][size=3]][/size][/b]
-
[color=#696969][size=2] 如果"action"为"show_item": [/size][/color]
-
— — — — [b][size=3]{[/size][/b]
-
— — — —[backcolor=initial] — [b][size=3][color=#000000]"[/color][/size][/b][/backcolor][backcolor=initial][b][size=3][color=#000000]id":[/color][/size][/b][size=2][color=#696969] [/color][/size][/backcolor][b][size=2][color=#2e8b57]字符串[/color][/size][/b][backcolor=initial][size=2][color=#696969] [/color][/size][/backcolor][backcolor=initial][size=2][color=#696969]物品的ID [/color][/size][/backcolor][b][color=#000000]必填[/color][/b]
-
[backcolor=initial]— — — —[/backcolor][backcolor=initial] — [size=2][color=#696969] [/color][/size][b][size=3][color=#000000]"[/color][/size][/b][/backcolor][backcolor=initial][b][size=3][color=#000000]count":[/color][/size][/b][size=2][color=#696969] [/color][/size][/backcolor][backcolor=initial][size=2][b][color=#a0522d]数值[/color][/b][/size][/backcolor][backcolor=initial][size=2][color=#696969] [/color][/size][/backcolor][backcolor=initial][size=2][color=#696969]物品的数量[/color][/size][/backcolor]
-
— — — —[backcolor=initial] — [b][size=3][color=#000000]"[/color][/size][/b][/backcolor][b][size=3][color=#000000]tag":[/color][/size][/b][size=2][color=#696969] [/color][/size][b][size=2][color=#2e8b57]字符串[/color][/size][/b][size=2][backcolor=initial][color=#696969] 物品的NBT [/color][/backcolor][/size]
-
— — — —[b][size=3] [/size][/b] [b][size=3]}[/size][/b]
-
[color=#696969][size=2] 如果"action"为"show_entity": [/size][/color]
-
— — — — [b][size=3]{[/size][/b]
-
[backcolor=initial]— — — — — [b][size=3][color=#000000]"[/color][/size][/b][/backcolor][backcolor=initial][b][size=3][color=#000000]type":[/color][/size][/b][size=2][color=#696969] [/color][/size][/backcolor][backcolor=initial][b][size=2][color=#2e8b57]字符串[/color][/size][/b][size=2][color=#696969] [/color][/size][/backcolor][backcolor=initial][size=2][color=#696969]想要显示的实体的种类,应为一个实体ID [/color][/size][/backcolor][b][color=#000000]必填[/color][/b]
-
— — — —[backcolor=initial] — [b][size=3][color=#000000]"name[/color][/size][/b][/backcolor][backcolor=initial][b][size=3][color=#000000]":[/color][/size][/b][size=2][color=#696969] [/color][/size][/backcolor][backcolor=initial][b][color=#ff0000]对象[/color][/b][size=2][color=#696969] [/color][/size][/backcolor][size=2][color=#696969]要显示的实体的[/color][/size][backcolor=initial][size=2][color=#696969]名字,若不规定显示为原名(比如“僵尸”)[/color][/size][/backcolor]
-
— — — — — —[backcolor=initial] [/backcolor][b][size=3]{ [color=#000000]...[/color] } [/size][/b][size=2][color=#696969]一个JSON文本对象,不能是列表[/color][/size]
-
— — — —[backcolor=initial] — [b][size=3][color=#000000]"id[/color][/size][/b][/backcolor][b][size=3][color=#000000]":[/color][/size][/b][size=2][color=#696969] [/color][/size][b][size=2][color=#2e8b57]字符串[/color][/size][/b][size=2][backcolor=initial][color=#696969] [/color][/backcolor][/size][color=#696969][size=2]显示的UUID,不需要真实存在[/size][/color][size=2][backcolor=initial][backcolor=initial][color=#696969] [/color][/backcolor][/backcolor][/size][b][color=#000000]必填[/color][/b]
-
— — — —[b][size=3] [/size][/b] [b][size=3]}[/size][/b]
-
— — [b][size=3]}[/size][/b]
-
— [color=#000000][b][size=3]"extra": [/size][/b][/color] [size=2][b][color=#ff0000]对象[/color][color=#800080]列表[/color][/b] [color=#696969]对象的附属项[/color][/size]
-
— — [b][size=3][[/size][/b]
-
— — — [b][size=3]{ [color=#000000]...[/color] }[/size][/b] [size=2][color=#696969]列表内包含一个或数个完整的JSON文本对象,会继承上级属性,除非重新指定[/color][/size]
-
— — [b][size=3]][/size][/b]
-
[b][size=3]}[/size][/b]
-
[/quote]
复制代码
|
#更新日志
Java 1.18/a 1.18版本升级完成
Java 1.18.2/b 完善+1
Java 1.19.3/a 1.19升级完成