扫码在手机阅读
手机阅读《Minecraft指令手册》
Minecraft指令手册

第26章更加精确的目标选择器下

仔细观察这条指令,你发现了什么?

没错,m参数要反过来排除特定模式的玩家,只需要在值前面加一个英文半角感叹号。和m参数一样,gamemode参数也同理:

/kill a[distance=..15,gamemode=!creative

用游戏模式筛选玩家的参数,在Java高于的版本中是gamemode,在基岩版以及低于的版本均为m。

那么它们怎么用呢?

众所周知,基岩版服务器并没有像Java版的服务器一样具有出生点保护,所以在基岩版,要让服务器主城不被恶意破坏,最基本的操作是使用范围冒险模式。比如这个中国版租贷服最初就用了如下指令:

name参数可以用于指定目标实体的名称。

使用/give给予某位特定玩家物品时,一般不会用到目标选择器,而是直接指定该玩家的玩家名(不会吧,不会吧,不会真的有人会用玩家的UUID使用/give指令吧)。

但如果要用目标选择器,还要锁定这名玩家该怎么办?

举个例子:

/give a[name=JIE灬挥刀乱砍] Skyward_Blade

这样子就可以锁定这名玩家并给予物品了。

name参数不光可以用于玩家名上,还可以用于实体名上。

比如某位Java腐竹为了实现将宝箱随机放在世界各处,用了如下指令:

/summon minecraft:armor_stand {CustomName:“\“A\““}

\\召唤一个名为A的盔甲架\\

/spreadplayers32 10000 false e[type=minecraft:armor_stand,name=A

\\将所有名为A的盔甲架随机传送到以该命令方块为中心20001x20001的范围内,且每个盔甲架间距不小于32格,不考虑盔甲架的队伍属性\\

/execute as e[type=minecraft:armor_stand,name=A] at s run ......(后面省略)

\\将执行者和基准点设定为名为A的盔甲架,并运行.....\\

可以发现,该腐竹为了防止执行指令时和其他实体发生冲突,特别使用了名叫A的盔甲架并用name参数锁定。同时,这位腐竹还用到了type参数。关于这个参数待会会讲倒。

name参数也可以像m、gamemode参数一样,使用感叹号反转为排除指定名称的实体,比如:

/kill e[name=!A

这条指令的作用就是:杀死名字不是A的实体。

需要注意一点,如果名字中包含空格,需要用双引号括起。比如:

/kill e[name=“genshin impact“

(垂直旋转角度)

(水平旋转角度)

还记得第九章的/tp吗?我们就在那第一次接触到了垂直旋转角度和水平旋转角度:

这两个由于是同类,我就合起来讲了。

在以上版本中,垂直旋转角度参数是x_rotation,水平旋转角度参数是y_rotation。在以下和基岩版中,两类角度分别是rx、rxm和ry、rym。

唉,你发现了没有?这和我们之前了解过的经验参数(l、lm和level)还有距离参数(r、rm和distance)差不多。那么格式是不是也是一样呢?

还真是一样的。既然格式一样,这里就不多说它的格式了。

rx、ry参数的作用是:选取垂直、水平旋转角度≤RX或RY的实体

rxm、rym参数的作用是:选取垂直、水平旋转角度≥RXM或RYM的实体

垂直旋转角度其范围是:90度(看星星)到-90度(看地上)。

水平旋转角度其范围是:-180度(北)到180度(还是北),或者说是上北-180°,下南0°。左西90°,右东-90°。

举个例子。某网易手机租贷服为了让玩家回城方便,搞了一个“回城雪球”,其指令如下:

ABC

A:重复,无条件,始终活动|需要红石

/execute e[type=snowball] execute p

=1.5,rx=90,rxm=60] execute e[type=snowball,c=1] tag s add back_home

\\选取雪球作为指令执行者,再以这个雪球为中心寻找半径1.5格内最近的低着头(头自水平线向下90°到向下60°)的玩家。如果找到,再以该玩家为中心寻找最靠近他的雪球,并给这个雪球赋予back_home标签。\\

B:连锁,有条件的,始终活动

/execute e[type=snowball,tag=back_home] tp p

=1.5] 323,65,72

\\选取具有back_home标签的雪球,并以它为中心将半径1.5格内最靠近它的玩家传送到(323,65,72)。\\

(这儿的坐标中间使用逗号分割是因为不使用逗号分开三个值就会粘在一起,实际使用时请删掉)

C:连锁,有条件的,始终活动

/kill e[type=snowball,tag=back_home

\\清除所有具有back_home标签的雪球\\

其中就有用到rx和rxm参数,用于筛选那些低着头扔雪球的玩家。

至于其中出现的tag参数,我们在上一章已经略过了,关于tag会在以后讲到/tag指令时提到。

ry和rym参数目前来说没有特别广的用途,只能举个没啥用的例子:

/kill a

y=180,rym=-180

这条指令可以杀死所有面向正北的玩家(神奇的是这并不会框选住所有活着的玩家,a

y=180,rym=179]才会框选住几乎所有活着的玩家)

至于x_rotation和y_rotation参数,你应该知道怎么用了吧?

a [x_rotation =35..]——所有头水平线朝下35°以上的玩家

a [x_rotation =..35]——所有头没有水平线朝下35°以上的玩家

a [x_rotation =0..35]——所有头水平线朝下0到35°的玩家

a [x_rotation =35]——所有头水平线朝下35°的玩家

a [y_rotation =60..]——所有朝向是在南偏西60°顺时针到正北这个范围内的玩家

a [y_rotation =..60]——所有朝向是在南偏西60°逆时针到正北这个范围内的玩家

a [y_rotation =60..120]——所有朝向是在南偏西60°顺时针到北偏西60°这个范围内的玩家

a [y_rotation =60]——所有朝着南偏西60°的玩家

(实体类型)

实体类型是type,上面我们已经见过了。

type和name本质上是差不多的,但是它筛选不是通过名字,而是通过实体种类。

什么是实体种类?比如一个玩家叫Notch,另一个玩家叫Hero

ine,虽然名字不同,但他们都是“玩家”种类的。又比如这里有一只马,那里有一只叫驴的马,虽然它们都叫马,但前者是马,后者是驴,并不是一个种类的。

type可以选定需要的实体大类,比如:

/kill e[type=minecraft:village

就可以杀死全部已生成的村民。

type一般来说仅用于e,因为只有e是包含非玩家实体的。

和name一样,type也支持感叹号反转:

/kill e[type=!playe

这条指令的作用是:杀死所有非玩家实体。

需要注意的是,name和type非感叹号反转的情况下都是不可重叠的,比如:

e [type =w, type =playe

像上面那样是不可以的,Minecraft中可没有既是牛又是玩家的动物。如果真有,那么也应该合并了,叫w_player(牛人)也是可能的。

(实体家族)

我们知道通过type可以选定特定的实体。但如果我们要选取一堆实体用于执行同一种指令呢?

记分板和NBT可以很好的解决这个问题。但在了解这两个东西之前,我们暂且没有除多弄命令方块以外的更好的办法。

Mojang估计看我们这么可怜,于是在基岩版中,加入了family参数。

网易版不知道有没有(应该不至于这么可怜,况且现在快照版都出好几个了,网易也在内测了,就算没有很快也要有了)

family参数和type参数差不多,只不过它是通过实体家族筛选的。

什么是实体家族?目前Mojang并没有对其有一个明确的定义,大致说的话......

举个例子:

僵尸知道吧?僵尸一般来说有三类变种:

尸壳、僵尸村民、溺尸

虽然它们客观上并不属于同一种实体,但主观上我们仍然会将它们归类到一个大类:僵尸类。

用Mojang的说法,它们都是属于同一个家族(family)的。

现在你应该知道实体家族到底是什么了吧?

由于实体家族是个新的东西,就连Minecraft Wiki也记载少之甚少,作者甚至专门翻了一下Mojang更新family时那个版本的日志,连提都没提。

现在已知的family参数值有九个:

mob——所有生物

inanimate——没有生命的实体

monster——所有怪物(攻击性生物)

undead——所有亡灵生物(用治疗药水和伤害药水效果相反的生物)

zombie——僵尸类生物

skeleton——骷髅类生物

wandering_trader——流浪商人(这商人是用金子做的还是这商品是用金子做的)

enderman——末影人

creeper——苦力怕

举个例子:

/tp e[family=creepe

这条指令的作用是:将所有属于苦力怕家族的实体传送到自己身旁。

当然,你也可以使用感叹号将作用反转。和type、name一样,family参数在非反转情况下也是无法叠加的。

需要注意的是,family参数是目前唯一一个基岩版独占的参数(Java不管新版旧版都没有这玩意儿)。

(NBT)

(进度)

(谓词)

上面这三个均为Java版独有,且我们还未接触到,暂时先留个坑,以后再填。

历史

Java

——加入目标选择器,最初只有a、r、p三个变量

1.8——加入了e变量和dx、dy、dz参数

1.9——m参数现在接受游戏模式全称和缩写,在此版本之前只支持数字ID。并加入了tag参数。

——移除了隐含目标选择器(如a[26,65,-28],应为a[x=26,y=65,z=-28]),并且错误的目标选择器不再略过,而是会报错。

——加入了s变量

——加入了NBT和进度advancements参数,并对原本的参数进行大改

——加入了谓词predicate

基岩版

——加入了family参数

——加入initiator变量用于NPC

/gamemode a a[x=726,y=89,z=-263,r=50

重复执行这条指令,就可以让主城范围50格内的所有玩家都改为冒险模式。但这有个缺点:腐竹也被改为冒险模式了。为了解决这个问题,这个腐竹给这个目标选择器添加了一个参数,变成:

=15,m=!c

这条指令的意思是:将范围15格内所有不处于创造模式的玩家全部杀死。

所以,虽然gamemode参数和m用法一样,但它仅支持上面四个值。

(游戏模式)

/gamemode a a[x=726,y=89,z=-263,r=50,m=s

这条指令和上一条指令的唯一区别就在于,它不会将不是生存模式的玩家改为冒险模式,这样子腐竹开着创造就不会受到影响了。其中新添加的m参数,值是s,也就是survival(生存)的缩写。

这条指令的作用是:将以基准点为中心,半径20格内的所有处于旁观模式的玩家,全都强制退后100格(^^^-100为局部坐标,会在第五十九章讲到)

现在我们知道如何选择特定游戏模式的玩家。但如果我们要反过来,排除特定模式的玩家该怎么办?

这位腐竹造了一个房子,为了防止他的房子被破坏,他做了一个简易的安保措施:

/kill a

/tp a

=20,m=3]^^^-100(仅适用于低于的Java版)

感叹号的这种用法,在接下来几个目标选择器参数中也会出现。

(目标名称)

而gamemode参数.......在版本中,Mojang重写了大量游戏基础代码,导致和版本许多游戏内容相差极大。所以在之前的章节中,你会发现许多指令都在更新中发生了大改,这种情况在以后的章节中也会持续存在。游戏模式也一样,在版本更新后,游戏模式就仅支持全称,即:

survival(生存模式)、creative(创造模式)、adventure(冒险模式)和spectator(旁观模式)。

m参数可以使用游戏模式的全称,缩写和数字ID。比如:

  • 加入收藏
  • 目录
  • A+
  • A-