跳到主要内容

2.2 简单命令

本节,我们将带你来了解 9 条你可能早已听说的命令。这些命令出名到什么地步?甚至连一些不搞开发的 UP 主、普通玩家、生存玩家,都对这些命令有所耳闻。你也很可能听过这些命令的鼎鼎大名。那我们一起来看一看吧!


帮助命令:/help

这条命令,我们曾在第一章时讲过,它会返回特定页码或命令的帮助信息。它有两条语法:

/help的语法
/help <页码: int>
/help [命令: CommandName]

例如,我们在 1.1 曾经布置了一道练习,要求你利用/help自学/difficulty。是否有印象呢?这里我们就是利用了第二条命令。

/help difficulty

这条命令还需要再介绍吗?我们认为应该无需多言了。

讲两句题外话。其实,我们认为这条命令的必选和可选参数的信息,可能有标注错误的嫌疑。实际的语法应该是

/help的实际语法
/help [页码: int]
/help <命令: CommandName>

这样,当你只输入/help的时候,页码默认为 1,所以返回第 1 页的信息;而查询命令则必须要你写入一条命令的名字。想想是不是这个道理?


给予玩家物品的命令:/give

嘿嘿,这位也是老朋友啦。我们曾经在讲物品这个概念的时候,学习过/give的语法。

还记得是什么语法吗?其实不记得也不要紧。真的!因为你随时都可以查文档,在实际运用的时候,旁边不会有监考老师监督你去做命令或者做什么,所以更重要的是你要知道这条命令能做什么,然后多加运用,你想记不下来都难!

那我们现在把这条命令的语法贴出:

/give的基本语法
/give <玩家: target> <物品: Item>

例如,/give @a apple,这里玩家是所有玩家(@a),物品是苹果(apple),所以是给予所有玩家苹果。有印象了吧!那我们接下来就要进行扩展了。

/give的扩展语法

还记得吗?我们曾经介绍基本语法的时候说,这条命令将给予玩家 1 个物品。为什么是 1 个?来,我们看看这个基本用法的命令参数。发现有什么特点了吗?没错,都是必选参数!这条命令后面还跟了三个可选参数,其中一个就是指代物品数量的。我们来看看这条扩展语法:

/give的扩展语法
/give <玩家: target> <物品: Item> [数量: int] [数据值: int] [组件: json]

/give

感觉除了数量都看不懂?没事,我们先来看数量,剩下两个我们一会儿解释。你可以看到,它接受一个int类型的参数,也就是整数。这很好理解,毕竟你不能给予 1.5 个苹果,对吧?数量是一个可选参数,这就是我们不指定也能成功运行的原因。对于每一个可选参数,都存在一个默认值。在这里,默认值就是1。也就是说,如果你不填写,它就只给予 1 个苹果。很简单吧?我们来实战一下。

实验 2.2-1

尝试写一条命令,给予你一组钻石。执行之以验证你的想法!

点我查看答案!

/give @s diamond 64

因此,现在你就知道:/give是能够给予数量个物品的。

物品数据值

物品数据值的概念稍微复杂一点。一个物品,也是可能具有多个状态的。例如,当你使用一把钻石剑杀死了一只僵尸,这把剑的耐久度会降低,也就是说不同的耐久度定义了同一个物品的不同状态。像这样,同一个物品的不同状态就用数据值(Data Value)来记录。特殊地,我们这里说的数据值指代的是物品数据值。

我们看到,数据值的类型是int,并且为可选参数。相信看到这里,不用我们说,你也知道这个参数该填什么了。该参数的默认值是0

一切物品都可以拥有数据值,不同数据值的同类物品,在物品栏也不能合并。特殊地,对于工具,数据值就代表着它的损坏值。例如,在 Wiki 中可以查到钻石剑的耐久是 1561 点,那么使用/give @s diamond_sword 1 1000就会给予你一把损坏了 1000 点耐久值,也就是剩余 561 点耐久的剑。

思考 2.2-1

为什么这里必须代表损坏值而非耐久值呢?

/give @s diamond_sword 1 1000

至于组件,我们认为现在聊这些还太早,我们希望等到你有更多的基础之后再来聊这些,不过你很快就会再次见到它的身影!

至此,我们可以给/give命令的含义做一个完全的总结:/give将给予玩家 数量个含有特定组件、特定数据值物品

扩展:关于物品数据值的历史问题

我们现在已经知道,数据值用来储存同一个物品的不同状态。刚刚我们列举了一个耐久度(或者准确来说叫做损坏值)的例子,和不同数据值的物品来和正常的物品作区分的例子。目前的数据值大体上也就只有这点应用了。

但是在以前,数据值的应用极为广泛,这里就不得不说到扁平化(Flattening) 所带来的影响了。如你所知,现在红色羊毛的 id 为red_wool、蓝色羊毛的 id 为blue_wool、等等等等,但是在以前,这些所有颜色的羊毛统称为wool,那么如何指定羊毛颜色呢?比如红色,我们就指定wool的数据值为14,黄绿色是5、黄色是4,以此类推。好记吗?当然不好记!所以常用的做法是,要么试,要么查。很明显,扁平化就是把这种压缩的 id 给扩展开来,展开为多个不需要数据值也能良好定义的物品 id

这样做的好处当然是很明显的,代码变得更易读:相比于/give @a wool 1 14,显然/give @a red_wool更能让人一眼看懂这条命令的含义。当然缺点也是有的,因为 id 的变化,导致老 id 在hasitem目标选择器参数的高版本适配中表现不佳;而且对于手机版玩家来说,要打的字又变多了,会更麻烦。

扁平化这个概念,最早出现在隔壁的 Java 版。在 Java 版 1.13,Mojang 将所有物品、方块(是的,以前方块也有数据值)的数据值通通消灭,全部进行了扁平化,特殊状态则转而使用 NBT 来代替。这也是当时的模组难以转换到高版本的一个重要原因,因为原版 ID 几乎是被重写了一轮,所以 Forge 没有办法及时作出适配。这也是很多模组玩家至今卡在 Java 版 1.12.2 的原因,因为很多模组从那之后就停更了,或者不愿再对高版本做出适配。

基岩版的扁平化则是从 1.19.70 的一次物品、方块 ID 拆分悄然开始的,直到现在,已经渐渐接近尾声。与 Java 版大刀阔斧地改,全然不顾向下兼容性不同,基岩版并没有任意选择版本的功能,因此 Mojang 为了对旧版地图、附加包有一定的适配,不至于让它们报废,这些老 id 还是可用的,不过自动补全就不会帮上你了。我们现在使用新版本时,还是尽可能地使用新版 id,适配性更好的同时也更加易读


清除物品的命令:/clear

说到物品操作,有给予就必定要有清除。我们现在就来介绍这条清除物品的命令/clear。它的语法是:

/clear的语法
/clear <玩家: target> <物品: Item> [数据值: int] [最大数量: int]

/clear

这条命令将清除玩家至多最大数量个数据值为数据值物品

可以看到,这条命令和/give有很多相似处。

实验 2.2-2

我们现在要给予自己一个苹果,再移除自己的苹果。这可以写为

/give @s apple
/clear @s apple

试执行之,体验一下这两条命令。在物品栏里再拿出一组苹果,然后再执行一次,体验一下最大数量的含义。

关于数据值,这是一个int类型的可选参数。其基本含义和/give是一致的,例如可能代表物品的状态、损坏值等等。但是,这里和/give有一点是不同的。我们可以试想一个情况:如果要清除玩家的钻石剑,但是玩家有多把钻石剑,损坏值或为 500,或为 1000,或为 1500 等数值,这种要穷举每种损坏值的情况自然是不现实的。因此,我们可以使用一个负数值来代表任意数据值的情况。例如:/clear @a diamond_sword -1就将移除所有玩家在任意损坏值的钻石剑。显然,数据值的默认值应当是一个负数,事实上其默认值为-1

思考 2.2-2

/give能否给予一个负数值数据值的物品,例如/give @a apple 1 -1?试分析之并在游戏中验证你的想法。

最大数量则被设立为第 4 个参数,这和/give是不同的(/give数量参数是第 3 个参数),因此这也是该命令使用的一个常错点。此外,注意该参数的描述为最大数量。和目标选择器参数c类似,即使物品数量少于这个值,也能够执行。我们以/clear @a apple -1 3为例:

  • 如果你有 20 个苹果,那么最多清除 3 个,所以最终你有 17 个苹果;
  • 如果你有 2 个苹果,那么最多清除 3 个,所以全部清除,你有 0 个苹果。

特别地,最大数量可以被填写为0。你可能会问:清除0个物品有什么意义?事实上,如果你拥有这个物品,这条命令不会清除你的物品,但是成功执行;而如果你没有这个物品,这条命令就将执行失败。换言之,最大数量0时,这条命令将起到检测物品作用。这在 1.18.30 之前,没有hasitem的时候是很常用的检测物品的手段。

/clear @s apple -1 0


更改玩家游戏模式的命令:/gamemode

这条命令你很可能已耳熟能详!很多人初接触命令时,可能就是先接触的这条命令。废话少说,我们直接上语法:

/gamemode的语法
/gamemode <游戏模式: int|GameMode> [玩家: target]

/gamemode

这条命令将把玩家调整为游戏模式。特别简单易懂的命令!

在游戏中,给出了两条语法。实际上,你可以看到它们之间只有接受类型的不同,因此我们在上面将两种类型int|GameMode合并到一个参数,代表该参数既接受int类型,也能接受GameMode类型,希望你能理解。

这个命令参数的类型是我们未曾遇到过的,然而自动补全已经告诉你可以填写什么。很显然,这个参数接受简写或全称的游戏模式的写法。因为首字母大写,这是一个穷举参数,意义是很明确的。我们在下文给出一个表,作为对应。

游戏模式GameMode的全称写法GameMode的简称写法对应的int
生存模式survivals0
创造模式creativec1
冒险模式adventurea2
默认模式defaultd5
旁观模式spectator
实验 2.2-3

例如,调整 Alex 为生存模式,就可以用/gamemode survival Alex。当然,/gamemode s Alex/gamemode 0 Alex都是可以的。试执行下面的命令,体验一下这条命令。如果害怕被史莱姆攻击影响输入命令,可以开和平。

/gamemode survival @s

其中,旁观模式不存在简称写法和对应的int。本教程一贯建议:为顺应 Java 版的趋势,游戏模式应写为全称写法

扩展:为什么旁观模式不存在简称和数字写法?

这是因为,Java 版自 1.13 后,该命令仅支持全称写法,而旁观模式在基岩版加入时间较晚,所以为了顺应 Java 版的趋势,就不再允许该模式写为简称或数字。旁观模式在 Java 版 1.12 以前的简称写法为sp。基岩版在刚加入旁观模式时,允许使用数字6指代该模式。

默认游戏模式

默认模式的概念其实特别简单。每个世界都存在一个默认游戏模式,每个玩家都可能是特定的游戏模式,也可能是默认游戏模式。只要你是默认游戏模式,就跟随这个世界的默认游戏模式来确定你的游戏模式。然而,这个概念确实是很少提及,也不太常用的。

默认游戏模式

冒险模式

冒险模式是一种类似于生存模式的游戏模式。然而,与生存模式不同的是:你不能随意地破坏方块、或者放置方块。只有使用命令给予的含有特定组件的物品,或者在允许方块之上,才能够进行放置、破坏等操作。

其中,组件这个东西已经被我们按下不表,我们打算在后续章节再和你谈这些。不过你可以先看到这些物品大体的特征如下:

冒险模式可用的物品

而允许方块,则是我们在第 3 章要着重介绍的东西。

旁观模式

旁观模式是一种允许玩家进行世界旁观的模式。在该模式下,玩家将能够飞行、允许穿墙、不能对世界进行任何操作等诸多重要特性。如果你正在做一张多人地图、或者希望玩家能够参观此地图、或者就是单纯地想找找地下的一些结构,等等需求,那么你很可能会用到这个模式!

旁观模式

扩展:Java 版的旁观模式

Java 版的旁观模式还能够通过鼠标滚轮改变飞行速度,以及能够进入生物(包括玩家)的视角。很遗憾,基岩版并没有这些。

目标选择器参数m

m取自于Mode,即查找特定游戏模式的玩家。其语法为:

目标选择器参数m的语法
m=<游戏模式: int|GameMode>

例如:@a[m=creative]将找到所有创造模式的玩家,@a[m=c]@a[m=1]也是同样的效果。

实验 2.2-4

依次执行下面的命令。

/testfor @s[m=creative]
/gamemode creative @s
/testfor @s[m=creative]

该参数支持反选,例如你可以使用@a[m=!adventure]来找到所有不是冒险模式的玩家。

m只能指定一次。

思考 2.2-3

如果m能够指定多次,@a[m=creative,m=survival,m=spectator]能否实现@a[m=!adventure]相同的效果?


清除实体的命令:/kill

我们曾经学习过/summon是生成实体的命令。/kill则是与/summon相反的命令,用于清除特定的实体。语法为

/kill的语法
/kill [目标: target]

/kill

这条命令将杀死目标

目标的默认值为@s。这个语法已经简单到无需我们再多说什么了。直接上实例:

  • /kill:杀死执行者自身。当然,如果你是创造模式,那么你是无法被杀死的。
  • /kill @e:杀死所有实体。当心!这在很多地图、模组中都是很危险的行为!
  • /kill @e[type=sheep]:杀死所有绵羊。
  • /kill @e[type=item]:清除所有掉落物。别忘了掉落物也是实体哦!

调整时间的命令:/time

/time是用于调整时间的命令。这条命令之所以“人尽皆知”,主要是因为基岩版有一个快速的自动命令输入功能:

/time命令的UI

这个界面可以让一名完全不懂命令的玩家也能轻易地更改时间。但是,我们现在并不能说自己完全不懂命令,我们的目标不应当局限于此。我们来看一下这条命令的语法:

/time的语法
/time add <数值: int>
/time query <day|daytime|gametime>
/time set <数值: int>
/time set <时间: TimeSpec>

/time

上面我们给出的语法中,和游戏内并不完全一致,这是因为TimeQuery类型是一个穷举参数,仅支持 3 种穷举条目:daydaytimegametime,所以我们直接展开写。

这条命令一共有 4 条语法,但事实上只有 3 个用法:addsetquery。我们挨个来解释。

设置时间

设置时间是我们最常用的用法,也就是set的那两条语法。我们看到/time set <数值: int|时间: TimeSpec>(这里也采用合并式写法)应当是接受一个数值或一个TimeSpec类型的参数的。

数值上,我们需要简单讲一讲。首先,有两个原理需要你了解:

  1. Minecraft 中的一天,对应现实是 20 分钟,也就是 1200 秒。
  2. Minecraft 存在一种叫做“游戏刻”的概念。游戏刻(Game Tick,简称 gt)简单来说,是指 Minecraft 完成一次代码循环所需的时间。对于 Minecraft,1 秒 = 20 游戏刻。这是极其重要的时间换算原理,因为在后面的/scoreboard、命令方块、函数、脚本等各方面,这个原理都无处不在,我们会在后面遇到的时候反复提及。执行一条命令所需要消耗的时间就是 1 游戏刻。关于游戏刻的更多说明,你可以参见 Wiki 的这个页面

因此,换算为游戏刻,Minecraft 的一天就是 1200×20=24000 游戏刻。数值所接受的就是以游戏刻为单位的整数。Minecraft 的白昼和黑夜几乎是一样长的,因此,0代表着一天初始;12000代表着黄昏,一天的夜晚即将到来;6000就是正午;而18000就是午夜时分。每1000游戏刻,在 Minecraft 中就代表着过去了 1 个小时。关于昼夜更替,你也可以参见 Wiki 的这个页面

TimeSpec,事实上它也是一种穷举参数,能够接受 6 种特殊时间。对应表格如下:

时间数值: int时间: TimeSpec备注
日出23000sunrise早上 5:00,注意不是早上 6:00
早上1000day早上 7:00
正午6000noon中午 12:00
日落12000sunset晚上 6:00
晚上13000night晚上 7:00
午夜18000midnight0:00

我们来举几个例子:

  • /time set 0:设置为早上 6:00。
  • /time set noon/time set 6000:二者完全等价,设置为正午。
  • /time set 36000:设置为第 2 天的日落时分。注意 36000 是第二天的时间范围。

增加时间

如果你理解了设置时间的那些内容的话,那么增加时间对你来说已经不再是一个难题。原理上来说,数值计算都是一样的。我们直接以例子讲解:

  • /time add 1:时间加快 1 游戏刻。
  • /time add -1:时间倒退 1 游戏刻。
  • /time add 24000:迅速经过一天。如果为夜晚,你可以用这条命令观察到月亮的变化哦!

查询时间

查询时间,也就是/time query <day|daytime|gametime>,允许你查询这个世界目前所处于第几天(day)、什么时间(daytime)、以及这个世界总共运行了多久(gametime)。如果你想跟你的小伙伴“吹嘘”自己的世界玩了多久的话,不妨来试试这条命令吧!

实验 2.2-5

依次执行下面的命令。

/time query day
/time query daytime
/time query gametime

最终,游戏将返回给你下面这个类似的消息:

/time query

天数和当前时间都是好理解的。而对于游戏时间,依据时间换算原理(1 秒 = 20 游戏刻),你可以将这个值除以 20,就是你这个世界所启动了的秒数。


传送玩家的命令:/tp(或/teleport

我们在第 1 章时曾介绍过,/tp是用于传送特定实体到特定位置的命令。然而我们在介绍此命令时曾说过,这条命令有多达 10 条语法,其中我们当时曾说,因为目标可以指定为@s,此时/tp ~~~/tp @s ~~~是等效的,这样 10 条语法中只需要理解 5 条带目标的语法即可。我们现在把这 5 条语法都放在这里:

/tp的语法
/tp <目标: target> <位置: target> [检查卡墙: Boolean]
/tp <目标: target> <位置: x y z> [检查卡墙: Boolean]
/tp <目标: target> <位置: x y z> [y旋转: value] [x旋转: value] [检查卡墙: Boolean]
/tp <目标: target> <位置: x y z> facing <面向实体: target> [检查卡墙: Boolean]
/tp <目标: target> <位置: x y z> facing <面向坐标: x y z> [检查卡墙: Boolean]

显然,我们以前所学习的语法是第 2 条语法。现在,让我们来看看其他的语法吧!

扩展:/tp的别名

/tp事实上有一个全称写法为/teleport,二者用法等同。对于写法方面,本教程不作任何建议,但根据附录 1发现,实际工程中使用/tp字段的频率要远远高于/teleport字段。

这种现象在其他命令中也很常见,例如/tell,也可以用/w/msg,三者用法等同;/?/help等同;/alwaysday/daylock也是等同的。至于为什么需要有这种等同含义的命令……这个还是去问 Mojang 吧。

可选参数:是否卡墙?

我们先来看第 2 条命令,相比于我们以前学习的命令,多了一个参数[检查卡墙: Boolean]。这个参数在其他语法中也同样存在。指定这个参数将让 Minecraft 检查传送的位置是否有方块,导致目标卡墙或卡在地里,如果有,则阻止之。该参数的默认值为false。例如:

  • /tp @s 0 -62 0 true:因为超平坦模式下一般而言,(0,-62,0)为泥土层,所以该命令会执行失败。
  • /tp @s 0 -62 0:游戏不会检查该位置是否有方块,并将玩家直接传送到土里。

/tp @s 0 -62 0 true

传送到特定实体的位置

现在我们观察/tp的 5 条语法。注意到只有第 1 条命令的位置参数接受target类型,代表它接受一个实体。事实上,这条命令的位置指代的实体,含义很明确,就是该实体所在的位置。

实验 2.2-6

执行命令/tp @s @e[type=sheep,c=1],观察自己的位置变化。这里指代c=1,是为了让命令能够更可控,按照预期执行。如果没有绵羊,可以手动生成一只。

/tp @s @e[type=sheep,c=1]

思考 2.2-4

按照前文的逻辑,你能否分析/tp Alex的含义?提示:该命令中,Alex并不是目标

以特定视角传送到特定位置

接下来我们关注/tp剩下 3 条语法。事实上,剩下的 3 条语法都是指定玩家以何种朝向传送到什么位置的。我们先来关注两个facing

指定朝向的/tp的语法
/tp <目标: target> <位置: x y z> facing <面向实体: target|面向坐标: x y z> [检查卡墙: Boolean]

同样地,为了简化到 1 条命令中,采用这种写法,代表该参数可能代表面向实体: target面向坐标: x y z,这种写法在本教程的后文中将不再赘述。如果不考虑检查卡墙(因为前文已经提过,这里也不再赘述),这条命令的含义是:

目标以面向面向实体面向坐标的朝向传送到位置

如果这么说,我们相信你应该已经掌握了该命令的用法。只是有一点需要注意:面向实体必须指定为 1 个,否则游戏将会报错。这是一个常错点。

实验 2.2-7
  1. 执行命令/tp @s ~~~ facing @e[type=sheep,c=1],这条命令应当将你传送到原位,但是强制令你面向附近的绵羊。
  2. 执行命令/tp @s ~~~ facing 0 -60 0,同样,这条命令将让你面向坐标(0,-60,0)。

旋转角度

然后我们再来关注剩下的那个语法。

指定朝向的/tp的语法2
/tp <目标: target> <位置: x y z> [y旋转: value] [x旋转: value] [检查卡墙: Boolean]

这里的y旋转x旋转是什么意思?

我们说,为完全地表示一名玩家在空间中的信息,只有玩家的空间位置是不够的,玩家的朝向也是很重要的。表示玩家的朝向可以用两组数yRot xRot来表示,这叫做旋转角度

我们如何用 2 个值就确定玩家的朝向?现在我们不妨先只考虑平视的情况。在 Minecraft 中,玩家的视角可以用一个单位向量(也就是一个长度为 1 的有方向的量)去表示,我们看到在平视的状态下,无论玩家如何旋转自己的视角,这个朝向的向量永远是绕着 y 轴旋转的。选定向南为 0°,顺时针方向记为正,这个向量与 0° 所成的夹角就是y旋转yRot,y Rotation):

yRot

这样,向西就是 90°,向北就是 180°,向东就是 270°。因为角绕始边转一圈后,终边位置不变,所以加减 360° 的结果是一样的,比如向东还可以表示为 -90°。

同样地,如果玩家向上或向下看,这时就认为玩家的朝向向量绕着 x 轴旋转,也就是x旋转xRot,x Rotation)。选定水平为 0°,顺时针方向记为正,则望向天空为 -90°,望向地面为 90°。

xRot

这样,平视和俯视的角度一结合,我们就可以用 2 个值确定玩家的朝向。至此,你已经完全了解了这两个值的含义。此外,这两个值同样支持波浪线写法,即~+(value)的写法。

实验 2.2-8
  1. 执行命令/tp @s ~~~ 90 0。易知,该命令将使你平视面向西方。
  2. 执行命令/tp @s ~~~ ~1。该命令将使你在 y 轴旋转上再加 1°。甚至于,如果你能每游戏刻执行此命令一次,你将能够以 20°/s 的角速度,在 18s 内原地转完一圈!类似的原理在/camera加入之前被经常应用,以实现转圈的动画效果。

目标选择器参数rxrxmryrym

这四个参数是比较容易和rrm搞混的,其实它们完全不是同一个概念。它们主要负责检测玩家的朝向信息。刚刚我们讲到,用y旋转x旋转可以确定玩家的朝向信息,而这四个参数主要负责检测玩家的朝向信息。是的,这里的 r 并不指代 Radius,而是 Rotation。它们的语法如下:

目标选择器参数rx、rxm、ry、rym
rx=<x旋转最大值: float>
ry=<y旋转最大值: float>
rxm=<x旋转最小值: float>
rym=<x旋转最小值: float>

rm类似,这里的 m 仍然指代最小值 Minimum。很多抬头检测、低头检测,就是基于这个目标选择器参数检测的。

实验 2.2-9

执行命令/testfor @a[rx=-85]。这条命令将检测所有抬头望向天空的玩家。

因为望向天空的 x 旋转值为 -90°,所以我们要检测 -90° 的玩家。但是,经过实验证明,玩家的 x 旋转角度不可能为极限值 -90°,所以我们需要确定一个大致的范围,这里采用 -85°~-90°,这时无需指定rxm,因为 -90° 已经到底;所以指定rx=-85


发送消息的命令:/say

/say这条命令真的特别简单。听说过学话游戏吗?这条命令就是做这个用的:原封不动地把你写的说出去。语法为:

/say的语法
/say <消息: message>

这条命令将在全局发送消息。这个消息的类型是message,其实你可以认为它就是不带引号的string。不过需要注意,message类型也可以含有目标选择器,并返回目标选择器所选定的实体的名称。

我们来举两个例子:

  • /say Hello,world!:在全服说[(你的名字)] Hello,world!
  • /say @e:在全服说[(你的名字)] (所有实体的名字),下图为示例。

/say @e


调整天气的命令:/weather

/weather是用于调整天气的命令。同样地,这条命令也含有一个 UI 可供你快速调整。它的语法为:

/weather的语法
/weather <clear|rain|thunder> [时长: int]
/weather query

可见,/weather有两条语法。第 1 条语法的含义为设置特定的天气为时长游戏刻。第 2 条语法的含义为查询天气。两条命令的语法都很简单,对吧?同样地,我们举两个例子:

  • /weather clear:设置为晴天。这个时长是在 6000~18000(即 5~15 分钟)随机取值的。所以使用这条命令后,你会感到雨可能没一会儿就开始下,而且很频繁。我们有一个办法可以设置为永久晴天,不过这就是后话了。
  • /weather query:查询当前的天气。例如,如果是晴天,就返回天气状态是:晴天,对,就这些。这条命令的意义大不大嘛……反正看个乐吧。

总结与练习

我们本节学习了很多基础概念和基础命令。为什么单独把这 9 条命令挑出来呢?因为掌握这 9 条命令,至少可以保证你能做一个最基础、最简陋的地图出来,它们足够简单、功能也比较强、而且流传度也比较高,有助于你上手命令。那么,现在我们就开始总结这节的内容吧!

另外我们还是要再三强调:实践是很重要的!请动脑思考并完成我们布置的练习,熟能生巧。我们不会要求你完全掌握语法,尤其是参数顺序之类的,毕竟各大文档都查得到这些东西,现学也赶趟。但是会要求你多练习,新手和老手之间的差别,就在于这经验上。

原理

  • 物品数据值:用于指代物品状态的一个数值。对于工具,用于指代损坏值。一切物品都可以拥有数据值,不同数据值的物品的状态不同,一般不可堆叠。允许时,-1代表任意数据值的该物品。
  • 冒险模式:类似于生存模式的游戏模式,但是不能随意地破坏方块、或者放置方块。只有使用命令给予的含有特定组件的物品,或者在允许方块之上,才能够进行放置、破坏等操作。
  • 旁观模式:允许玩家进行世界旁观的模式,能够飞行、允许穿墙、不能对世界进行任何操作等。
  • 游戏刻:Minecraft 完成一次代码循环所需的时间。
    • 时间换算原理1 秒 = 20 游戏刻,牢记!
  • 游戏内的时间:Minecraft 中,一天为 20 分钟,24000 游戏刻。
  • 旋转角度:玩家的视角向量可以分解为平视方向的向量和上下方向的向量,它们分别绕 y 轴旋转和绕 x 轴旋转,所以用这两组数表示玩家的朝向。均以顺时针为正方向。平视时,向南为 0°;上下方向上,水平为 0°。

命令

以下标粗的命令,为中频或更高频的命令,为重点掌握的命令。

命令含义备注
/help <页码: int>返回第页码页的帮助信息
/help [命令: CommandName]返回命令的帮助信息
/give <玩家: target> <物品: Item> [数量: int] [数据值: int] [组件: json]给予玩家 数量个含有特定组件数据值物品注意/clear/give的参数顺序
/clear <玩家: target> <物品: Item> [数据值: int] [最大数量: int]清除玩家至多最大数量个数据值为数据值物品注意/clear/give的参数顺序;物品不足最大数量亦可成功执行;最大数量可以为 0
/gamemode <游戏模式: int|GameMode> [玩家: target]玩家调整为游戏模式游戏模式建议使用全称
/kill [目标: target]杀死目标谨慎使用/kill @e
/time add <数值: int>加快数值游戏刻的时间
/time query <day|daytime|gametime>查询世界处于第几天、或时间、或存在总时长
/time set <数值: int|时间: TimeSpec>设置世界的时间为数值(或时间
/tp <目标: target> <位置: target> [检查卡墙: Boolean]传送目标位置实体处的位置,检查检查卡墙
/tp <目标: target> <位置: x y z> [检查卡墙: Boolean]传送目标位置坐标处的位置,检查检查卡墙
/tp <目标: target> <位置: x y z> [y旋转: value] [x旋转: value] [检查卡墙: Boolean]按照旋转角度y旋转x旋转传送目标位置坐标处的位置,检查检查卡墙
/tp <目标: target> <位置: x y z> facing <面向实体: target|面向坐标: x y z> [检查卡墙: Boolean]按照面向面向实体(或面向坐标)的朝向传送目标位置坐标处的位置,检查检查卡墙面向实体至多指代 1 个
/say <消息: message>在全服务器发送消息
/weather <clear|rain|thunder> [时长: int]设置特定的天气为时长游戏刻
/weather query查询天气

目标选择器参数

目标选择器参数取自意义备注
m=<游戏模式: int|GameMode>Mode查找m的玩家允许反选,只能指定一次
rx=<x旋转最大值: float>x Rotation查找 x 旋转值小于rx的玩家
ry=<y旋转最大值: float>y Rotation查找 y 旋转值小于ry的玩家
rxm=<x旋转最小值: float>Minimum x Rotation查找 x 旋转值大于rxm的玩家
rym=<x旋转最小值: float>Minimum y Rotation查找 y 旋转值大于rym的玩家
练习 2.2
  1. 写一条命令以给予全体生存模式下,低头的玩家 10 朵蒲公英(dandelion)。
  2. 写一条命令以清除玩家的至多 10 朵蒲公英。
  3. 开发者 A 希望制作一个商店系统。现在我们假设 A 想要实现的效果为 1 颗钻石兑换 5 个草方块,他的思路如下:
    第一步,用/clear (玩家) diamond -1 1清除玩家的钻石;
    第二步,如果这条命令执行成功,就执行/give (玩家) grass_block 5以给予玩家 5 个草方块,从而达成兑换效果。请问:
    (1)这样做是否可行?为什么?
    (2)如果不是 1 颗钻石兑换,而是 2 颗,那么执行/clear (玩家) diamond -1 2,成功后再执行/give (玩家) grass_block 5,这时是否可行?为什么?
  4. 写一条命令以使所有玩家都正视东北方向。
  5. 很多地图事先都要经过这样的初始化:调整天气为晴天,并调整时间为白天。试用两条命令执行之。后面你会学到用/gamerule命令阻止天气和时间变化的方法。
  6. 现在要实现这样的逻辑:如果有玩家开了创造,就将这个玩家调整为生存,并警告这个玩家。我们将这条命令分为 2 个部分:
    命令 A:实现“如果有玩家开了创造,就将这个玩家调整为生存”的功能;
    命令 B:如果命令 A 成功执行,实现“警告这个玩家”的功能。
    事实上,这就是大多数地图采用的防作弊系统。请试写出这两条命令,警告消息可以写为“§c你不能开启创造模式!”
  7. 我们曾经在我们的作品中实现了这样的功能:玩家处于旁观模式时,抬头即可切换为创造模式。试写出这条命令。
  8. 很多服务器都会采用定时清理掉落物的功能,试写出清除所有掉落物的命令。