前言

命令,在Minecraft中的重要性不言而喻。但网上的一些教程,出现了这样的一种情况:老手只是来看一个灵感,新手直接抄却什么也没有学到。所以拥有两年半命令学习与实践的我,做了这一个教程。

这篇教程专门为我的世界Java版1.21版本打造,基岩版与Java版在命令层面有大量的不同,基岩版的请酌情查看。

部分命令语法格式

():表示在命令中可有可无的参数部分,用于修改命令或者规范作用

<>:表示必须拥有的参数部分

| :表示选择,在这个分割线的旁边的参数选择一个。

例子:

/execute  <storage|as|in|at...>

表示在execute后面的参数可以在as,storage,in,at等参数中选择,这里参数过多所以省略了,以后将/execute命令的时候会把全部内容列出来。

萌新级命令

学习目标:

  1. 了解部分简单命令(没有任何参数)

  2. 学会使用时间单位

/seed

作用:查询当前世界的种子,永远会成功(除非权限不够)。

在单人游戏中无需作弊就可以使用。在多人游戏需要2级管理员权限,以防止他人获得该世界的种子,用像chunkbase的那种网站,破坏游戏体验。

语法:

/seed

当这个命令成功执行之后,它会在聊天栏返回当前的种子,此时点击它便可以将其复制至剪切板。

/defaultgamemode

作用:修改默认的游戏模式。

应该很多的玩家接触过/gamemode(这个命令由于有目标选择器所以放在后面),但它只能更改自己的游戏模式。如果这个时候来一个新玩家,他仍然是第一次创建世界时的游戏模式。而这个命令能很好地解决这个问题。

该命令需要2级管理员权限,也就是说,在没有开启作弊的情况下将无法使用该命令。

语法

/defaultgamemode <游戏模式>

参数:

游戏模式:必填,可以填写下列的4种:

  1. survival(生存模式)

  2. creative(创造模式)

  3. adventure(冒险模式)

  4. spectator(旁观模式)

其中:由于极限模式是以存档为单位,无法修改。

但是我并不建议大家使用这个命令来更改游戏模式,相比命令,使用调试快捷键f3+f4可以快速更改游戏模式(需要作弊或者管理员权限)。

/me

作用:发送一条关于自己的消息

所以为什么我不直接发送消息呢?/tell也有其他作用(不让别人知道)……这个命令真的很鸡肋,甚至连wiki都没有记载它的出现时间。

语法:

/me <输出信息>

参数:

输出信息:必须为一个文本(字符串),作为输出显示的内容。

/list

作用:显示当前在线玩家的列表。(tab:那我走?)

可能开发它只是为了更好的查看全部玩家的uuid吧。

语法

/list (uuids)

若没有加uuids参数,则只会返回当前在线玩家。加入后还可以显示玩家的uuid。但真的有人用uuid吗?(指平常生存)

/setworldspawn

作用:用于设置世界出生点,新玩家会重生于此,出生点区块也会重新加载。

这个命令对于一些地图玩家有着规范玩家出生点的作用,但是不建议设置为重生点。若要改变重生点请使用/spawnpoint命令(这个后面会讲)

语法:

/setworldspawn (坐标) (旋转方向)

参数:

坐标:为一个x y z组成的三维坐标,其中x轴与z轴只能在-3千万至3千万之间,y轴必须要在0至256区间内。可以使用波浪号来表示绝对坐标,不能使用拖字符来表示相对坐标。如果不填则默认为执行位置的坐标。

旋转方向:为一个双精度浮点数(其实就是小数),代表玩家生成时的视角偏移方向。方向表如下:

方向参数
正南0.0
正西90.0
正东-90.0
正北-180.0

如果方向没有填写则默认为当前方向。

/time与时间单位

这个命令大家应该都有所了解,其作用十分简单,就是查询时间与修改时间。

由于该命令可以修改时间,所以需要管理员权限。

语法:

/time <set|add|query> <时间|时间类型>

参数:

不同的选择对应着不同的功能:

/time set设置到对应时间
/time add添加对应的时间,不可为负数
/time query查询时间

时间:要增加或设置的时间,1.14后可以设置单位,若不设置时间单位默认单位为刻(t)

时间单位分为3种:

游戏刻(tick)t
秒(second)s
天(day)d

1游戏刻=0.05秒

1游戏中没有分钟的单位,请不要写时间单位为m或min。

1天=24000刻=1200秒

其中:刻(t)是游戏中每一次运算所使用的单位,每1tick游戏进行一次运算。在Minecraft中使用的单位基本上都是tick。


时间类型:不同的命令选择拥有不同的类型可选:

add不可用
set可选择day(日出后),noon(中午),night(太阳下山后),midnight(午夜)
query必须为daytime(游戏当天时间,单位:tick),gametime(总共游玩时间,单位:tick),day(总共游玩游戏天数,单位:day)


时间值换算为刻后必须为介于0和2,147,483,647之间的整数,如0.5d。

例子:

/time add 3d

将时间设置为3天后

/time set 3

设置时间为3刻时。

注意:游戏日期是从第0天开始计时的,也就是说,如果你在刚创建世界时输入/query day,显示的是第0天。

入门级命令

现在,你已经了解了一些最简单的命令。但是这些的实用性还是过小,所以我们现在要进一步地学习。

学习目标:

  1. 初步了解目标选择器

  2. 熟练使用命令方块

  3. 初步了解部分实用性命令

目标选择器变量

目标选择器,是用于方便玩家选定生物来执行命令的东西。通俗点讲,就是更改执行者。

熟练地使用目标选择器是做好命令的关键,这可以让不同的生物收到命令影响。

目标选择器是命令的必修课,要做好命令必需要有足够的目标选择器的功底。

目标选择器共有以下这些变量:

@a

选择所有的玩家,无论死活。

@p

选择距离执行者最近的玩家,无论死活。若在命令方块中执行,则以命令方块为执行者。若在服务器控制台中执行,则设置默认基准点为世界出生点。

@s

表示执行者,无论死活,表示只选择唯一一个实体,但其实可以用/execute指令搭配来表示多个实体,这个在后面会讲。

@r

选择随机一名玩家,无论死活。

@n

选择距离执行者最近的实体。

@e

选择所有的实体。

/kill

为了帮助后面目标选择器参数的理解,在这里插播一条命令。

作用:杀死(游戏内称为清除)选定的生物。

这个作用就不用多说了吧,一些地图作者测试时经常使用的。大家很多时候忽然嘎掉也是这个命令搞的鬼。

语法:

/kill (目标)

参数:

目标:为一个玩家名字或者一个目标选择器,会杀死目标选择器选定的执行者,被执行者可以为多个。

若没有目标参数,则默认杀死执行者。

例子:

/kill @r

随机选择一位幸运儿并嘎掉它。

现在你应该知道为什么服务器不准命令方块循环/kill @a了吧。

现在我们回到目标选择器,看向目标选择器参数。

【重点】目标选择器参数(Part1)

单使用目标选择器变量还是难以控制,所以官方推行了一个新东西:目标选择器参数。其对于目标选择器变量起到限制作用。

x,y,z

在世界中定义一个位置作为目标选择器的执行位置,这可能会导致@p的执行者发生改变(但我们就是要这个效果)。若其中某个参数未被定义,则默认使用执行者的位置。

例子:

/kill @p[x=0,z=0]

杀死位于x与z坐标均为0的最近的玩家。

dx,dy,dz

选择基于一个坐标的x,y,z轴的差异范围中的实体。相当于圈定一个范围、区间。在其中的实体执行命令。

例子:

/kill @e[x=0,z=0,dx=3,dz=7]

杀死所有在x轴位于0至3之间的,z轴位于0至7之间的玩家。

distance

以执行者为中心,对于符合特定距离(以欧几米德距离为标准,就是两点中的直线距离)的玩家执行命令。

distance参数不允许使用负数。

distance参数中可以用省略号表示可被检测的距离,举些例子:

diatance=2.. 则距离执行者距离大于2的会执行命令

distance=..1 则距离执行者距离小于1的会执行命令

distance=1..5 距离执行者距离在1~5之间的会执行命令

距离参数用于检测玩家的位置,对于一些地图用很大用处,也可以配合原始JSON文本进行告示。(可能有点超纲了?)

例子:

/kill @e[distance=..5]

杀死距离执行者5格之内的所有实体,执行者若为实体则也会被杀死,因为他也符号要求。

name

这个目标选择器参数可以查找具有规定名字的实体,作为该领导的被执行者。

这个名字也可以指定为非玩家实体,使用命名牌就可以使这个目标选择器检测到它。

该参数其中填写字符串,包含空格时应当用双引号括起,但不能是原始JSON文本。

该目标选择器允许在等于号前面增加感叹号以取反。

例子:

/kill @a[name=!Notch]

杀掉所有名字不为Notch的玩家。

type

限制执行实体的类型,使规定的实体执行命令。

实体类型必须使用实体ID或实体标签(还没讲到)。如果实体ID的命名空间为minecraft则可以省略命名空间。注意:实体ID或标签区分大小写。

可以使用感叹号进行取反。

例子:

kill @e[type=!player]

杀死所有非玩家实体。

x_rotation,y_rotation

用于检测玩家的视角位置,以符合条件的玩家为执行者。其中:

x_rotation为垂直旋转角度,y_rotation为水平旋转角度。

垂直旋转角度,更具体地说,是旋转高度与地平线的夹角,以度为单位。垂直旋转值从-90(垂直向上)向上增加,之后增加到0(水平),最后增加到90(竖直向下)(因此垂直旋转值随着向下旋转而增加,怎么这么反人类),不支持取反。

此选择器支持使用省略号圈定范围,语法与distance一样。

而水平旋转角度以正南(或正Z轴方向)为基准顺时针旋转。水平旋转值从-180(面向正北)开始,到-90(面向正东),再到0(面向正南),再到90(面向正西),最后到180(再次面向正北)。怎么又这么反人类

在Java版中,此选择器也支持用省略号圈定范围。

举一个例子:

/kill @a[x_rotation=-90,y_rotation=-180..-90]

杀死所有面向东北方向,抬头看的玩家。

level

用于检测玩家的经验值,由于非玩家实体没有经验值则会直接忽略。

此目标选择器允许使用省略号圈定范围(跟distance语法一样)

请注意:这里的等级并非经验点数,所以刚满100级与差一点经验到101级的玩家在@a[level=100]都是一样的。

还是举一个例子:

/kill @e[level=..1]

杀死所有经验等级小于1的玩家。

gamemode

检测游戏模式,由于非玩家实体没有游戏模式,会自动过滤掉非玩家实体。

允许的参数如下:

游戏模式对应参数
创造模式creative
冒险模式adventure
生存模式(包括极限,极限其实也算生存的一种)survival
旁观模式specter

允许使用感叹号进行取反。

例子(取反):

/kill @r[gamemode=!survival]

随机抽取一位幸运玩家,如果其游戏模式不为生存模式,则杀死它(防挂是吧)

limit

加入了该参数之后,目标选择器将只会选择规定数量的目标。这个参数在部分命令中是必须的(例如/data指令与/tp指令)

当目标选择器为@p,@r与@s时,会默认为@p[limit=1],@r[limit=1]与@s[limit=1]。此时更改其limit,可以修改选定的玩家数量。

limit可以反向选择,但跟普通的感叹号取反不同,它的反向选择是取数值的相反数。

例子:

/kill @p[limit=2]

杀死最近的2名玩家。

/kill @p[limit=-2]

杀死最远的2名玩家。

sort

指定选择对象的距离,以此距离排序并选择对应实体。(就是指定优先级)。

可选的值有以下4个参数:

nearest选取最近的(@p的排序方式)
further选取最远的
random随机选取(@r的排序方式)
arbitrarty选取最近生成的(@a,@e的排序方式)

例子:

/kill @e[type=minecraft:villager,sort=further]

杀死距离执行者最远的村民。


【经验分析】目标选择器参数误区

注意:目标选择器内的每一个参数都必须匹配,目标选择器才可以执行,而并不是其中一个成功就执行!

例如:

/kill @e[type=player,type=zombie]

然而这个命令并不会杀死所以的玩家与僵尸,相反,它任何作用,因为这个命令拥有两个type参数,然而目标选择器参数需要全部满足才能够执行。也就是说:需要有一个生物既是僵尸又是玩家才可以被杀死,而没有生物会拥有这种属性,因此不可能执行,系统会直接报错。如果需要同时杀死僵尸与玩家,至少也需要两条命令:

/kill @e[type=player]
/kill @e[type=zombie]

请注意:这里的@e[type=player]不可以改为@a,因为前者不会对死亡未复活的玩家执行命令,但是后者无论死活,两者不可相提并论。


目标选择器是关于命令的一个重要组成部分,在选择指定实体的时候,目标选择器是十分重要的。请确保你已经读懂了目标选择器的章节,再查看后面的教程。

【选学】目标选择器的相互转换

目标选择器拥有以下的几个变量:

@e,@a,@r,@s,@p,@n


其中@s代指全体玩家,意思就是type=player,所以@a也可以写成:@e[type=player]

然而,这两个还是有一个不同点:@a当玩家死亡未复活的时候也可以被选中,但是@e[type=player]无法选中死亡但没有复活的玩家。这个可以用来判定玩家是否死亡,但是实际上作者并不推荐使用这种方法,作者更建议使用复合型计分板来检测,计分板将会在以后讲。


@p指距离目标最近的玩家,相当于sort=nearest且type=player。由于其只指定一位玩家,所以还需要加入limit=1!

因此命令方块中的@p也可以写为@a[sort=nearest,limit=1]或者@e[type=player,sort=nearest]

其中@a[sort=nearest]与@p可以直接划上等号,因为它们都会检测到死亡未复活的玩家,然后@e[type=player,sort=nearest]仍然由于type=player的限制无法检测到死亡未复活的玩家。这点需要注意!


@n会选择最近的一个实体执行命令,与@p的效果几乎一样,只不过一个是选择最近的玩家,一个是选择最近的实体。同样的,由于它仅选择一个实体,我们需要加入limit=1!

那么根据以上转换的经验,我们同样可以将@n转换为@e[sort=nearest,limit=1]且可以划上等号,因为两者都不可以选择死亡中的实体。


合理运用目标选择器之间的互相转换与type=的特性,可@r会随机选择一位玩家执行命令,与sort=nearest的效果不谋而合。同样的,由于它仅选择一位玩家,我们需要加入limit=1!


那么根据以上转换的经验,我们同样可以将@r转换为@a[sort=random,limit=1]且可以划上等号。@e[type=player,sort=random,limit=1]即使可以随机选择一位玩家,但是仍然无法选择死亡未复活的玩家。以使你的命令漏洞更少,更加稳定。

【难点】命令方块

上面我讲到的命令,都是以玩家来执行的,但是玩过地图的人都知道:地图里面是没有人在一旁跟你输命令的。这个时候,命令方块就可以粉墨登场了。

命令方块作为专门为命令量身定做的产物,自然是不能以特殊的渠道获取。在设置中点入控制页面,看见一个叫做“创造模式物品栏”的选项,将其开启即可在创造模式下看见右下角多了一个物品标签页,里面就有命令方块。

请注意:命令方块根基岩一样无法破坏,且为了保证游戏的平衡性,除非使用漏洞,否则管理员权限低于2的玩家即使位于创造模式也无法破坏命令方块。

命令方块具有方向,放置时请确保你的方向正确。

命令方块共有3种类型:

脉冲型命令方块

这类命令方块呈现为橙色,会在输入红石信号的时候激活,它会在激活的时候执行一次其内部的命令。

循环型命令方块

这类命令方块呈现为紫色,当其被激活时,每1tick都会执行一次其内部的命令。

(这里告诉大家一个知识,1秒=20tick,tick中文名为游戏刻[game tick],缩写为t或者gt)

连锁型命令方块

这类命令方块呈现为青色,只有在指向它的命令方块执行成功的时候才会正常执行一次其内部的命令(视为激活)。

补充:请不要想着用命令方块造一个循环,每一个命令方块在1tick之内最多只能运行一次,就算是被脉冲型命令方块指向的若在该tick之内运行过,也不会执行,视为命令执行失败。

条件制约与不受限制

在命令方块界面,可以选择命令方块的执行命令是否被条件制约。

默认为不受限制。

当类型为不受限制时,无论后面的命令方块是否成功执行,其都会正常执行命令,失败则跳过。

当类型为条件制约时,只有其后方的命令方块成功执行,其才会正常执行对应命令。

不受限制与条件制约的箭头会有纹理上的差别

红石控制与保持开启

若为红石控制时,只有周围出现毗邻的电源,毗邻的充能方块,输出信号且指向红石信号的红石中继器或者红石比较器,附着其上或者指向其的激活的红石时才会激活。

若为保持开启时,其会一直保持为激活状态(似乎只对循环型命令方块有效?)

【经验分析】命令方块的误区

条件制约的命令方块检测的是其后方是否成功执行,而不是指向它的命令方块是否成功执行,若不知道这个差别,会导致命令链出现错误。

命令方块是有延迟的,延迟为1tick。但是连锁型命令方块是无延迟的。可这并不代表它们是混乱的,实际上,命令方块的运行也是有先后顺序的。

因此一个脉冲型命令方块前面跟上一大堆连锁型命令方块,可以使连锁型命令方块与脉冲型命令方块均在1tick之内执行完毕,相比于人力不知道快多少倍。

即使命令方块在1tick之内会有序执行,但是若分叉过多仍然会导致混乱的现象,但是在少的命令方块内执行还是没有问题的。

若连锁型命令方块为条件制约的类型,则不仅需要指向其的命令方块执行,而且还需要其背对的命令方块也正常执行,才可以正常执行。

/tell,/msg,/w

/tell,/msg与/m是同一个命令,同一个功能,只不过是缩写而已。

作用:给其它玩家说悄悄话(游戏中是这么写的),意思就是只有发生者与接受者才可以看见。

语法:

/tell (/msg或/w) (目标选择器) (内容)

其中:目标选择器只可以选中玩家。内容需要加上引号。

当玩家被使用这个命令时,其聊天界面会显示:xxx悄悄地对你说:xxx,且其显示为灰色斜体。

而使用该命令的人会显示:你对xxx悄悄地说:xxx。且其显示未灰色斜体。

例子:

/m Notch "你是创世神"

/tp与/teleport,相对坐标与局部坐标

/tp基本上是了解命令的人应该都知道,但大多数人不知道的是/tp其实是/teleport的缩写。这里作为一个冷知识,两个命令作用相同。

这两个命令可以说是特别的实用了,它们可以用于传送实体。

语法:

/tp(或/teleport)(被传送实体)<传送位置>

参数:

被传送实体:为一个目标选择器,可以选择多个实体,执行命令时符合条件的实体会被一起传送。

传送位置:可以为一个实体,且只能为一个(limit=1),如果为目标选择器则必须要加入“limit=1”,否则就算只有一个实体匹配也会执行失败。执行成功后,所有被传送实体会到该实体的位置上。其也可以为一个相对坐标与一个绝对坐标。


那么仔细看完参数的人就会问了:什么是相对坐标与局部坐标?

比如说,你想要把自己传送到自己前方,难道穷举吗?或者让它告诉你坐标你再进行一系列计算吗?这也太差劲了。所以这个时候,你就需要相对坐标与局部坐标了。

相对坐标:以世界中心(0,0,0)为中心,其实就是我们常说的坐标。基本上,游戏中显示的基本上都是相对坐标。在命令中,如果要表示自己的相对坐标,就可以使用符号“~”(波浪号)来表示。

例如:

/tp @s @s ~ ~ ~

如果你现在在(11,64,14)的地方,则该命令会自动解析为(等同于)

/tp @s @s 11 64 14(原地tp)


然后是局部坐标,相当于世界中心就是执行者自己。你就是(0,0,0),使用符号“^”。以你前面为x轴正方向,建立坐标系。

使用相对坐标与局部坐标时可以在后面加上数字,游戏会使用你当前的相对坐标与绝对坐标进行加法运算。如果要进行减法运算只需要在后面填入负号即可。

这里以两个相似的命令进行举例:

/tp @e[type=pig] @s ~3 ~ ~
/tp @e[type=pig] @s ^3 ^ ^

虽然这两个命令十分相似,但是作用却大有不同。

第一个命令是将所有的猪tp到你的相对坐标3个前面,也就是说,如果你在(11,64,14)处,则所有的猪会被传送至(14,64,14)处。由于相对坐标是不会运动的,你执行多少次(前提是你不动)它们都会在同一个地方出现。

而第二个命令是将所有的猪tp到你的视角正前方,因为你所朝向的位置为x轴,所以tp到你局部坐标的x轴的前,就是tp到你正前方的3格。这个坐标会跟随着玩家的视角移动而移动。也就是说,你只需要移动你的视角就可以改变实体的传送位置。


回到正题,/tp(teleport)指令有一个易错内容。如果我使用这个命令,那么它会是什么意思呢?

/tp @e[type=villager,limit=1,sort=nearest]

难道是把自己最近的村民tp到我们这里来吗?(把村民作为被传送着,相当于/tp @e[type=villager,limit=1,sort=nearest] @s)

不知道有没有注意到语法那边,显示被执行者为可选项,而传送位置为必选项?这里两个参数只有一个,那么只有一个可能:村民为传送位置,而并非被传送实体。

所以实际上,这个命令其实等同于下列命令:

/tp @s @e[type=villager,limit=1,sort=nearest]

请反复查看本章节内的内容,因为本章节内容过多且十分抽象,对于一些空间力较差的人可能难以理解。请务必了解之后再查看后续的教程。


教程还没写完,未完待续……