UID 82897 性别 保密 经验 EP 铁粒 粒 回帖 0 主题 精华 在线时间 小时 注册时间 2021-7-23 最后登录 1970-1-1
本帖最后由 Cat_Anchor 于 2024-8-14 08:32 编辑 前言
今天我们来讲目标选择器。这看起来很简单,实际上却没那么简单,可能还有一些人不知道一些选择器参数。所谓目标选择器,就是可以灵活地选中不同实体的工具,格式就是 @ 符号加上一个字母或单词,如 @p。 基础选择器
截至 1.21.0 版本,基岩版的目标选择器一共有 6 种,而教育版有 8 种,Java 版有 7 种。@e
第一种就是 @e。@e 会选择这个世界上所有活的实体,这是很常用的一个目标选择器,不过大部分时候都要加额外的参数来限定目标。
一个很好的例子就是 /kill @e,会杀死世界上所有实体,经常用于创造档清理实体,减少卡顿。@s
第二种是 @s。@s 会选择命令的执行者,不论死活,玩家死了以后在聊天栏里输入命令照样能作用于玩家身上。这个选择器的运用也很广泛,比如对于开了保留物品栏的玩家而言,/kill 就是快速回家命令,其中省略了参数 @s。还有 /tp x y z,也省略了坐标前面的 @s。
但是如果命令的执行者不是实体,比如命令方块,比如脚本,那么这个目标选择器不会选择任何东西,命令会执行失败。@a
第三种是 @a。@a 会选择世界里所有玩家,不论死活,也就是说可以用这个特性配合 @e 做死亡检测。这个选择器用得也比较频繁,制作在线时间就需要这个。@p
第四种是 @p。@p 检测最近的活的玩家,不能用 type 参数改变类型。这个目标选择器经常用于测试命令,比如在聊天栏输入,当然也能在命令方块中输入。@r
第五种是 @r。@r 检测随机的活的玩家,可以用 type 参数改变实体类型。这个目标选择器比较冷门,很少被用到。@initiator
第六种是 @initiator。@initiator 比较特殊,它只能在 NPC 对话中用到,用于选择与 NPC 对话的玩家。这个目标选择器也较少被用到,不过用到 NPC 对话以后就大概会用到这个了。如果不在 NPC 对话中使用,它不会选择到任何东西。@c @v @n
剩下三种一起说。@c 仅在教育版中存在,用于选择自己的智能体;@v 也仅在教育版中存在,用于选择所有智能体;而 @n 是 Java 版的目标选择器,选择最近的活着的实体。 选择器参数
目标选择器之后还可以加上一个方括号 [],用于添加参数,而参数可以进一步限定目标选择器选择到的实体。基本格式就是 [参数=值,参数2=值2, ...]下面将列出所有基岩版的参数。type tag name family scores
type 用于选择一类实体,参数是实体的ID,可以省略 minecraft: 前缀,例如 @e[type=pig] 会选择所有猪。还可以在等号之后加上半角叹号 !,用于反选,例如 @e[type=!chicken] 会选择所有不是鸡的实体。注意,虽然可以同时使用多个 type 参数,但它们之间是“和”的关系,只有一个实体都满足时才会选择它。
tag 用于选择有特定标签的实体,参数就是标签名称,只有配合 /tag 命令添加的标签才能使用,例如 @a[tag=abc] 会选择所有带 abc 标签的玩家。也可以用半角叹号 ! 反选,还可以输入空值,比如 @a[tag=] 就是选择所有有任意标签的目标,@a[tag=!] 就是选择所有没有标签的目标。
name 用于选择有特定名称的实体,参数是实体名称,例如 @e[name=abc] 会选择所有名称为 abc 的实体。也可以用半角叹号 ! 反选,还可以输入空字符串,比如 @a[name=""] 就是选择所有没有名称的目标,例如没命名的除玩家外的实体。如果名称全是数字或者有空格或特殊符号,那么需要用""括起来。
family 用于选择有特定族的实体,参数为族的名称。族是一个用于标记特定实体的字符串,比如 mob 族就是所有生物,inanimate 就是非生物实体,也有用于实体生成的族,可以用 ! 反选。例如 @e[family=mob] 选中所有生物。
scores 用于根据计分板选择实体,格式为 [scores={计分板名称=值,计分板名称2=值2, ...}],其中值可以是一个整数,或者一个范围,也可以用 ! 反选。例如 @a[scores={aaa=5..}] 选择所有 aaa 计分板的值为 5 及以上的玩家,而 @a[scores={aaa=..24}] 选择所有 aaa 计分板的值为 24 及以下的玩家,@a[scores={aaa=5..24}] 选择所有 aaa 计分板的值为 5 到 24(包含)的玩家,@a[scores={aaa=!17}] 选择所有 aaa 计分板的值不为17且存在分数的玩家。c x y z dx dy dz r rm
c 用于选择一定数量的实体,也可以判断实体的位置关系,值为整数。如果输入正数,那么选择最近的<值>个实体;如果输入负数,那么选择最远的<值>个实体。如果目前存在的实体数量小于指定的值,仍会选择那些实体。例如 @e[c=-4] 选择最远的 4 个实体。
x y z 用于改变目标选择器的判断位置,会影响 @p、c 和 r 参数选择的结果,也会影响 dx dy dz 的选择范围。它们的值默认是命令执行的位置,输入的值可以是浮点数和整数,也可以用 ~ 符号改变相对位置。如果输入整数,那么会自动加上 .0 让它变成浮点数。例如 @p[x=0,y=-60,z=0] 选择距离(0, -60, 0)最近的玩家。
dx dy dz 用于指定一个立方体框并选择框内的实体。起始点是 x y z 参数,dx dy dz 指定三个方向上的立方体的长度,可以用整数或浮点数。例如 @e[x=~-5,y=~-5,z=~-5,dx=10,dy=10,dz=10] 会选择以自身为中心,10格为边长的正方体内的实体。
r rm 指定一个(中空)球形区域并选择其中的实体。r 为最大半径,可以输入整数,选择的区域就是以 x y z 参数为中心,以输入值为半径的球体。rm 为最小半径,可以输入整数,就不会选择以 x y z 参数为中心,以输入值为半径的球体内的实体,两个参数并用就能形成中空的球形选择区域。例如 @e[r=10,rm=5] 会选择距离自身 5 至 10 格的实体。rx ry rxm rym l lm m
rx rxm 用于根据实体的垂直旋转角选择,例如玩家抬头或低头的程度。rx 用于指定最大值,rxm 用于指定最小值,输入整数。抬头的玩家的垂直旋转角是负数,玩家的最大值为 -89,实际最大值为 -90;低头的玩家的垂直旋转角是正数,玩家的最大值为 89,实际最大值为 90。例如 @a[rx=-88] 选择所有抬头的玩家。
ry rym 用于根据实体的水平旋转角选择,例如玩家面朝东方或西方。ry 用于指定最大值,rym 用于指定最小值,输入整数。水平旋转角从-180(北 z-)开始增加,依次为 -90(东 x+),0(南 z+),90(西 x-),最后是 180(北 z-)。例如 @a[rym=0,ry=90] 选择所有面向南方和西方之间(包含)的玩家。
l lm 用于根据玩家的经验等级选择。这两个参数只能用于玩家。可以输入整数,选择等级为这两个整数之间(包含)的玩家,例如 @a[lm=20,l=30] 选择经验等级为 20 至 30(包含)的玩家。
m 用于根据玩家的游戏模式选择,只能用于玩家。可以输入spectator(旁观模式)、adventure或2或a(冒险模式)、creative或1或c(创造模式)、survival或0或s(生存模式)和default或5或d(默认模式)。可以使用 ! 反选,例如 @a[m=!2] 选择所有非冒险模式的玩家。haspermission has_property hasitem
has_property 用于根据实体属性选择,语法为 [has_property={property=属性名,属性名2=值2,属性名3=值3, ...]。这个参数只能用于玩家。其中 property= 用于检测指定属性是否存在,可以用 ! 反选。“属性名=值”用于检测指定属性是否为指定值,这个值支持整数、范围、浮点数、布尔值和用 "" 括起的字符串。注意这里的检测为严格相等(===),只有两边的数据类型相等且内容相等时才相等,这时 true 1 1.0 这三个值并不相等。例如 @e[has_property={property=minecraft:is_rolled_up}] 选择所有有 minecraft:is_rolled_up 属性的实体,而 @e[has_property={minecraft:aaaaa=1..5}] 选择属性 minecraft:aaaaa 的值在 1 和 5 之间(包含)的实体。
haspermission 用于根据玩家输入权限选择,语法与 has_property 类似,为 [haspermission={权限=值,权限2=值2, ...]。这个参数只能用于玩家。其中的权限必须为 camera(转动相机视角权限)或 movement(移动权限),值必须为 enabled(启用)或 disabled(禁用)。例如 @a[haspermission={camera=disabled}] 选择禁用转动相机视角权限的玩家,而 @a[haspermission={camera=enabled,movement=disabled}] 选择启用转动相机视角权限,并禁用移动权限的玩家。
hasitem 用于根据持有的物品选择实体,语法为 [hasitem={选项=值,选项2=值2, ...}] 或 [hasitem=[{选项=值,选项2=值2, ...}],[{选项3=值3,选项4=值4, ...}]]。这个参数在一个目标选择器里只能出现一次,不能重复出现。大括号内的选项可以重复出现,但只有最后一个会生效。选项共有 5 个,值的类型根据选项决定。下面列出这些选项和对应的作用。item 用于指定要检测的物品,必须是有效的物品 ID,或有物品形式的方块 ID。必须填写。
quantity 用于检测物品的数量,包括多个槽位物品数量的总和,支持 ! 反选和范围。如果为 0..,那么忽略这个(大括号内的)条件。如果为 0,那么选择没有该条件指定物品的实体。可选,默认为 1..。
data 用于检测物品的数据值,只能用于物品而非方块,方块的数据值只能被检测为 0。范围是 0 至 32767(包含)的整数。可选,默认为 0。
location 用于检测物品所在的物品栏,例如盔甲、副手和快捷栏。填入不存在的物品栏会导致继续检测物品,然而此时只会检测到空的物品栏,也就是数量为 0 的物品。quantity 检测的值包含 0 时,实体会被选中。无 slot 参数时可选,默认为所有可能的物品栏,有 slot 参数时必须填写。
slot 用于检测物品所在的槽位,支持 ! 反选和范围。值通常是自然数(范围),即从 0 开始的整数(构成的范围)。 后记
这一期是对目标选择器的详细介绍。最近应该不会再写关于命令的内容了,再写下去我自己都觉得是在炒冷饭了。下期可能是基岩版原始 JSON 文本,或者 NBT 相关的内容,不过这都只是计划,可能会变化。