——游戏模式——
用游戏模式筛选玩家的参数,在Java1.13及以上版本中是gamemode,在基岩版以及低于Java1.13的版本均为m。
那么它们是怎么用的呢?
众所周知,基岩版服务器并没有像Java版服务器一样具有出生点保护,所以在基岩版,要让服务器主城不被恶意破坏,最基本的操作就是使用『范围冒险模式』。比如这个中国版租贷服最初就用了如下指令:
/gamemode a @a[x=726,y=89,z=-263,r=50]
重复执行这条指令,就可以让主城范围50格内的所有玩家都改为冒险模式。但这有个缺点:腐竹也被改为冒险模式了。为了解决这个问题,这个腐竹给该目标选择器添加了一个参数,变成:
/gamemode a @a[x=726,y=89,z=-263,r=50,m=s]
这条指令和上一条指令的唯一区别就在于,它不会将不是生存模式的玩家改为冒险模式,这样子腐竹开着创造就不会受到影响了。其中新添加的m参数,值是s,也就是survival(生存)的缩写。
m参数可以使用游戏模式的全称,缩写和数字ID。比如:
/tp @a[r=20,m=6]^^^-100(仅适用于基岩版)
这条指令的作用是:将以基准点(在这是指令执行位置)为中心,半径20格内的所有处于旁观模式的玩家,全都传送到执行者背后100米处(^^^-100为局部坐标,会在第五十九章讲到。『6』在这是基岩版1.19及以上版本为实验玩法的旁观者模式的数字ID。没错,基岩版也有旁观者模式了,只不过在测试而已)
而gamemode参数.......在Java1.13版本中,Mojang重写了大量游戏基础代码,导致Java1.12.2和1.13版本中,许多游戏内容差异极大。所以在之前的章节中,你会发现许多指令都在Java1.13更新中发生了大改,这种情况在以后的章节中也会持续存在。游戏模式也一样,在Java1.13版本更新后,游戏模式就仅支持全称,即:
survival(生存模式)、creative(创造模式)、adventure(冒险模式)和spectator(旁观模式)。
所以,虽然gamemode参数和m用法一样,但它仅支持上面四个值。
现在我们知道如何选择特定游戏模式的玩家。但如果我们要反过来,排除特定模式的玩家该怎么办?
这位腐竹造了一个房子。为了防止他的房子被破坏,就做了一个简易的安保措施:
/kill @a[r=15,m=!c]
这条指令的意思是:将范围15格内所有不处于创造模式的玩家全部杀死。
仔细观察这条指令,你发现了什么?
没错,m参数要反过来排除特定模式的玩家,只需要在值前面加一个英文半角感叹号。和m参数一样,gamemode参数也同理:
/kill @a[distance=..15,gamemode=!creative]
感叹号的这种用法,其实就是不等号在计算机语言中的常见形式(=!)。这种不等号反转选择的用法在接下来几个目标选择器参数中也会频繁出现。
——目标名称——
name参数可以用于选取指定名称的实体。
使用/give给予某位特定玩家物品时,一般不会用到目标选择器,而是直接指定该玩家的玩家名(不会吧,不会吧,不会真的有人会用玩家的UUID来使用/give指令吧)。
但如果要用目标选择器,还要锁定这名玩家该怎么办?
举个例子:
/give @a[name=JIE灬挥刀乱砍] Skyward_Blade
这样子就可以锁定这名玩家并给予物品了。
name参数不光可以用于玩家名上,还可以用于实体名上。
比如某位Java腐竹为了实现将宝箱随机放在世界各处,用了如下指令:
/summon minecraft:armor_stand ~~~{CustomName:“\“A\““}
\\召唤一个名为A的盔甲架\\
/spreadplayers ~~ 32 false @e[type=minecraft:armor_stand,name=A]
\\将所有名为A的盔甲架随机传送到以该命令方块为中心的×范围内,且每个盔甲架间距不小于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吗?我们就在那第一次接触到了垂直旋转角度和水平旋转角度:
这两个由于是同类,本书就合起来讲了。
在Java1.13及以上版本中,垂直旋转角度参数是x_rotation,水平旋转角度参数是y_rotation。在Java1.13以下和基岩版中,两类角度分别是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°。
等等,我们在讲tp时,不是说水平旋转角度是:『以实体为中心,以正南(z轴正方向)为0°,顺时针下来,实体朝向和正南方向的夹角(也或者说实体在真南方位角体系中朝向的角度),就是该实体的水平旋转角度。』
那这怎么跑出来负数了?
其实在Minecraft中,水平旋转角度虽然可以像我们之前在第九章讲tp时那么用,但大多数时候,你都得这么用:
以正南(z轴正方向)为0°,顺时针旋转180°通过正西至正北,用正数,逆时针旋转180°通过正东至正北,用负数。比如-45°,就代表以正南为基准,逆时针旋转45°的方向;30°,就代表以正南为基准,顺时针旋转30°的方向。
也就是说,在Minecraft中,水平旋转角度的正确范围是-180°~180°,而不是0°~360°。至于为什么我要在第九章那么讲,只是怕一下子就把负数搬出来会吓你们一跳。
现在我们回到正题。
举个例子。某网易手机租贷服为了让玩家回城方便,搞了一个“回城雪球”,其指令如下: