命令教程“真”从零开始 (六) /tag指令,与进阶~选择器参数 [1.18]
声明:
1. 本教程默认所有读者看过本系列之前的内容。作者不对可能冒出来的术语或方言负责。以前帖的链接在最后。
2. 本系列教程默认读者拥有关于Minecraft游戏的基础了解。
3. 本系列全部教程适用于当前Java最新版(1.18)。
4. 本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。
前言
我们的指令教程已经有了5帖了,这已经是计划的8分之1。
但是,在前5帖中,你可能一直在冒出关于选择器的的疑问。
喂,别告诉我你忘了什么是选择器,那个在第一帖就讲了。
我们当前接触到的选择器只有五种 * : @a(选择所有玩家)@p(选择最近玩家)@r(选择随机玩家)@e(选择所有 实体 )@s(选择执行者)
好像够用了?
好吧,一点都不够用。
仅仅使用上面5个选择器,我们无法选择单一一只苦力怕,不知道如何选择处于特定位置的玩家——一点都不够用。
所以今天,我们就来探讨一下——如何更精确的选择?
这就是本帖的内容—— 选择器参数(Selector parameter)
* 教育版的选择器不考虑在内
标签 /tag
让我们从一个实例开始:
随机分队
第4帖 我们讲了队伍指令,(不懂请回去看)相信你已经......有一些队伍竞技地图的构思了吧!
那,今天的问题就是,如何,随机的,把玩家添加至数个不同的队伍中?
假设,我们有10个玩家进行随机分队,分成红蓝两队,每队5人——你该怎么办?
找一下上方的选择器,涉及到随机的是 @r(选择1个随机玩家) 。
看起来我们是要用这个选择器喽!
不错嘛,10位玩家,把指令: /team join @r red 运行5次就可以把五名玩家添加进红队(red)了......是吗?
选择器@r全称应该是 “在所有玩家中随机选择一名” ,那......如果重复运行上述指令,有可能重复选择。@r可能抽中已经加入了红队的玩家,这样就无法确定肯定有5名玩家在红队中。
如果你运气不好,甚至可能从始至终都抽中一人。
我们该如何以一种更精确的方式区分不同玩家?
容我介绍下面这一条指令——
标签/tag
这条指令可以为实体添加标签,并可以使用选择器参数来选择拥有特定标签的实体——
格式:
- /tag <目标> add <名称>
- /tag @r add choose
想要添加一个参数,紧接着它打上中括号“[]”:
@a[]
中括号内部打上你要的参数:
参数名=值
啊啊,翻译一下:
选择标准=值
我们的选择标准是标签: tag
我们要选择的标签是前面添加的 choose 。
两者联起来就是“tag=choose”。
添加到选择器后的中括号内:
@a[tag=choose]
本选择器会选择所有带有choose标签的玩家。
你当然可以使用其他选择器:
- @r[tag=choose]
- @p[tag=win]
把它添加到以前讲过的指令中:
- /kill @a
- /kill @a[tag=dead]
- /scoreboard players add @r[tag=add] score 10
- /tp @e[tag=teleport] 0 0 0
所有用选择器的地方都可以使用选择器变量。
你懂了么?我应该讲明白了。
标签会持续保持在实体身上,直至被删除——
删除标签格式:
- /tag <目标> remove <名称>
本指令可以删除一个标签:
- /tag @p remove dead
- /tag @a[tag=delet] remove choose
- tag <目标> list
- /tag @a add choose
- /tp @r[tag=choose] 0 100 0
- /team join @p red
- /tag @p remove choose
- /tp @p <x> <y> <z>
除了通过标签选择玩家,还可以通过队伍选择玩家:
- [team=<队伍>]
这个选择器会选取所有属于指定队伍的玩家:
- @r[team=red]
如果不填“<队伍>”,会选择所有没有队伍的玩家:
- @r[team=]
- /team join @r[team=] red
- /team join @a[team=!red] blue
- @a[limit=3]
- @r[limit=5]
- /team join @r[limit=5] red
- @<选择器>[<参数>=<值>,<参数>=<值>,…]
- @a[team=blue,tag=!dead]
- /kill @p[team=!,limit=3]
我们还可以使用以前讲过的记分板来选择目标:
- @a[scores={<记分板ID>=<值>,...}]
本参数会选择所有在<记分板ID>上的分数符合<值>的玩家。
- @a[scores={test=5}]
这里有一个很方便的事情就是,你可以用".."来表示分数“几~几”:
- @e[scores={test=0..10}]
你也可以在一侧留空来表示大于或小于:
- @e[scores={test=10..}]
这里还有一个比较方便的地方,就是:
- @e[scores={test=5..10},scores={abc=7}]
这个分成了两个条件并以","相连的选择器可以被简化为这样:
- @e[scores={test=5..10,abc=7}]
你可以在大括号中添加“,”来表示两个不同的记分板。
通过位置选择玩家
本参数可以选择位于特定坐标的玩家:
有两种方法可以这么做,但首先要指定一个 基准点 。
基准点是哪里?
额,就是,从哪里开始算。
接下来要填入“算到哪里”。
我们有两种方法,一种是指定距离,一种是对角体积。
指定距离:
- @a[x=<值>,y=<值>,z=<值>,distance=<值>]
其中,“x=”,“y=”,“z=”就是基准点的坐标,而“distance=”即是以基准点为中心,离基准点多远的目标:
- @a[x=100,y=100,z=100,distance=10]
除此之外还可以进行体积选取
确定一个根据基准点向三维延伸的第二个坐标“dx,dy,dz”,并选择两个坐标所形成的长方体区域:
- @a[x=100, y=100,z=100,dx=10,dy=-5,dz=5]
是不是看糊涂了?
一般来说这种时候后面肯定有图:
这样,图中画的就是@a[x=100,y=100,z=100,dx=10,dy=-5,dz=5]的选择区域。
通过类型选择实体
@e 这个选择器是可以选择除了其他玩家的生物的,但就麻烦在它是“选择所有实体”这个巨大的范围。
而本参数可以选择不同类型的实体:
- [type=<实体类型>]
“<实体类型>”需要填写任意一个实体的ID,比如creeper是苦力怕,那么:
- @e[type=creeper]
如果你不知道实体ID是什么的话,可以查找 Wiki的这个页面
此外,你还可以使用标签(Tag)来选取所有处于该标签下的实体:
@e[type=#impact_projectiles]
选择所有弹射物
这包含了箭矢,雪球,火球,末影珍珠等所有弹射物。
在这里寻找标签列表 。
注意!这和上面的指令/tag不是一个东西,别搞混!
排序
到这里我们可能有几个问题:
1. @a是所有玩家,但是如果加入了前面说的“limit=”,就会限制选择的玩家数量,比如“@a[limit=3]”最多只能选择3个玩家了——那么,这三个玩家是如何选择出来的?随机的?有某种规律?我们能否调整?
2. 如何选择一名随机的实体?@r是选择随机玩家,并不包含实体。
以上这两个疑问都可以使用“sort=”来解决。
sort,即排序,可以在使用“limit=”的前提下决定“如何排序”。
我们有4种选择:
sort=nearest : 靠近近者优先。
- @e[limit=1,sort=nearest]
- @a[limit=2,sort=nearest]
额,本选择器与“@p[limit=2]”是等价的。
sort=furthest 由远到近。
- @e[limit=2,sort=furthest]
sort=random 随机选择。
- @e[limit=3,sort=random,type=creeper]
sort=arbitrary 不排序也就是@a与@e的默认情况。
这个参数没有啥用:
@r[limit=3,sort=arbitrary] 与 @a[limit=3] 是等价的。
注:现在已经无法直接在@r上使用type=来指定类型,必须使用sort=
我宣布,本帖从此进入垃圾时间
其他选择器
以下是一些不需要讲解,但为了完整性又必须放上来的选择器:
以下选择器均支持使用"!"。
指定目标的经验等级过滤目标
- [level=<值>]
- @a[level=12]
本选择器参数支持使用“..”作为范围:
- @a[level=5..]
通过游戏模式选择目标
我们还可以通过游戏模式选择目标——这种方式经常用来在地图里对付开创造作弊的熊孩子们。
- [gamemode=<模式>]
<游戏模式>的值可以参考第三帖的内容。
这会自动过滤非玩家目标。
- @a[gamemode=creative]
名称选择:
- [name=<ID>]
这是一个字符串,应当用双引号括起,但注意,这不是JSON。
- @a[name=Steve]
选择所有叫史蒂夫的玩家。
嗯......虽然用史蒂夫皮肤的玩家挺多,但能叫steve的只有一个。
通过旋转选择目标
- [x_rotation=<值>]
- [y_rotation=<值>]
这可以选择朝向指定方向的目标,关于如何填入数值,请去第2帖查阅/tp指令或这去找Wiki。
这里注意,有一个和你印象不符的事情是,y_rotation指的是“沿y旋转”,也就是水平旋转。x_rotation反而是仰角。
此选择器支持使用范围:
- @e[y_rotation=0..90]
以上就是今天的全部内容了。
除了我们提到的选择器限制条件以外,还有类似于进度,NBT与谓词等选择器——这些我们会在讲到是再详细说。
这一帖好乱啊,状态不佳。
原因是写到一半的草稿因为论坛特性被发出来了......我有在矿工茶馆说过。
还有就是,我的输入法坏了,只能用mac自带的,(真的很垃圾)
然后数据又丢了,只好重写。
结果重写完后发现原来一直在我的剪切板里有备份......
本一帖写的超级混乱。我不知道你们是不是看得云里雾里,思路被打断太多次了。
啊啊啊啊啊啊啊啊
请你们离发疯的我远一点。
附录
#更新日志
Java 1.16.5/a 页面发布
Java 1.16.5/b 修改了有关distance=的错误,重新整理格式。
Java 1.16.5/c 根据 Wiki命令:语法 ,更改了命令语法
Java 1.17/a 1.17版本升级完成
Java 1.18/a 1.18版本升级完成
上一篇: [命令] 记分板与/scoreboard 命令教程“真”从零开始 (五)
系列《命令教程“真”从零开始》
前往来自 麻瓜草稿簿 的 系列教程索引
下一篇: [命令] 新手指令杂烩2号 命令教程“真”从零开始 (七)
