第八十九章 ride-骑乘
(该章节已于2022年7月25日重写,原章节为『战利品表(战利品表下)(/loot 下)』)
我们知道,在Minecraft中,玩家可以骑上马,骷髅可以骑上蜘蛛,僵尸可以骑上鸡......但不管怎样,我们都很难使用指令来控制实体的骑乘状态。在Java版这尚且可以通过NBT做到,但在基岩版呢?基岩版可用不了NBT。
好消息是,基岩版虽然用不了NBT,但Mojang却给了我们一条指令:
/ride
作用:控制实体骑乘
存在版本:基岩版1.16.100-今
需要权限等级:基岩版-1
需要作弊:是
格式:
/ride <骑手实体>...
... start_riding <坐骑实体>[传送模式][骑乘建立要求]
\\使得指定的骑手骑在指定的坐骑上\\
... stobr /_riding
\\使得指定的骑手停止骑乘\\
... summon_ride <实体ID>[召唤要求][生成事件][实体名称]
\\给骑手召唤一个坐骑,让骑手骑上去\\
/ride <坐骑实体>...
... evict_riders
\\使得指定的坐骑逐出它们的骑手\\
... summon_rider <实体ID>[生成事件][实体名称]
\\给坐骑召唤一个骑手,让召唤出来的骑手骑在坐骑上\\
通过/ride指令,你可以指定实体骑或被骑在某些实体身上。让我们来试一试:
/ride @s start_riding @r[tybr /e=horse]
这条指令将会使你随机骑在某一匹马的身上。等等,@r不是用来随机选择玩家的吗,怎么能够拿来随机选择马?
@r确实是用来随机选择玩家的,但在除了Java1.13及以上版本之外,其他版本的@r都可以通过指定tybr /e参数来具体随机指定种类的实体。在上面的例子中,由于我们指定了tybr /e参数为马,所以@r[tybr /e=horse]在这边就是随机选择一匹马。
运行上述指令后,你虽然骑在了马身上,但同时也被传送了,毕竟游戏总不可能让你隔空骑马吧?但有时候可能你并不想被传走,而是想让那匹马自己过来,这时候该怎么办?
指定『传送模式』参数。这个参数可以填写两个值:
telebr /ort_ride——将坐骑传送至骑手
telebr /ort_rider——将骑手传送至坐骑(默认)
举个例子:
/ride @s start_riding @r[tybr /e=horse] telebr /ort_ride
这条指令将会随机一匹马传送到你下面,然后让你骑在它的身上。
『骑乘建立要求』这个参数适用于当你指定多个骑手时的情况,它可以填写两个值:
if_groubr /_fits——当所有骑手都满足骑乘要求时才会建立骑乘关系
until_full——给每一个满足骑乘要求的骑手建立骑乘关系(默认)
举个例子:
/ride @e start_riding @r[tybr /e=chicken] telebr /ort_rider if_groubr /_fits
/ride @e start_riding @r[tybr /e=chicken] telebr /ort_rider until_full
假设现在有三个实体:你自己、一只成年僵尸、一只鸡。运行第一条指令,将不会发生什么,因为你不可能骑在鸡上面,鸡也不能骑在自己上面,@e选中的三个骑手中有两个不满足要求,自然僵尸也不会骑上去。运行第二条指令,僵尸就会骑到鸡的上面,因为虽然你和鸡都不满足要求,但僵尸满足了要求,自然就和鸡建立起了骑乘关系。(你干嘛~哎哟)
这个僵尸还有用,让我们把它从鸡上弄下来:
/ride @e[tybr /e=zombie] stobr /_riding
summon_ride子命令可以直接生成一个实体作为坐骑,当然,如果骑手不符合被生成实体的骑乘要求,那么实体即使被召唤出来也不会被骑乘,仅仅只会单纯生成出来。还是以刚才的条件,举个例子:
/ride @e[tybr /e=zombie] summon_ride minecraft:boat
这将会给那位僵尸生成一艘船,然后让它坐进去。
『召唤要求』参数可以填写三个值:
skibr /_riders ——仅仅为没有坐骑的骑手召唤坐骑
no_ride_change ——仅仅为没有坐骑且也没有被骑乘的骑手召唤坐骑
reassign_rides——为所有骑手召唤坐骑(默认)
举些例子:
/ride @e summon_ride minecraft:boat skibr /_riders
/ride @e summon_ride minecraft:boat no_ride_change
/ride @e summon_ride minecraft:boat reassign_rides
还是以上面的情况为条件。如果我们运行了第一条指令,游戏将会尝试给玩家(你自己)、鸡和船召唤坐骑,僵尸由于已经有一个船作为坐骑所以不会尝试召唤。
如果我们运行第二条指令,游戏将会仅给玩家和鸡召唤船作为坐骑。僵尸由于已经有坐骑、船由于被僵尸骑乘,所以两者都不会尝试召唤坐骑。
如果我们运行第三条指令,游戏将会给所有实体都尝试召唤坐骑。
当然,不管你运行的是上面哪条指令,最终结果都是你和鸡会坐上船,僵尸和僵尸的船不会发生变化。因为僵尸已经有一个船作为坐骑,再召唤的话,僵尸的新坐骑必定会插入到僵尸和船之间,骑着船也被僵尸骑,也就是得满足两个实体的骑乘要求。而船肯定不会被船骑乘,也不会骑着一个船,所以僵尸和船都不会发生变化。
evict_riders子命令可以使坐骑赶走自己的骑手:
/ride @e evict_riders
这将会使得所有实体赶走自己的骑手,也就是让你、鸡和僵尸都从船上下来。然后你就可以把船回收一下。
summon_rider子命令可以为一个坐骑生成骑手,举个例子:
/ride @e[tybr /e=zombie] summon_rider minecraft:zombie
仍然以上面的情况为条件,这条指令将会给那只僵尸生成一只新的僵尸,然后让新的僵尸骑在老的僵尸上面。
值得注意的是,由于成年僵尸也可以像幼年僵尸一样骑在成年僵尸上,这就给了我们一条途径在基岩版弄叠罗汉:
/ride @e[tybr /e =zombie] summon_rider zombie minecraft:as_adult
这将会给让所有僵尸尝试生成一个新的成年僵尸作为自己的骑手,然后.......你重复运行下试试?
这就是/ride指令的基本用法,也就是本章的全部内容。
附表:/ride历史
基岩版
1.16.100——加入了/ride
......
......
......
......
......
......
......
......
......
自然生成的僵尸,有5%的概率生成出一只幼年僵尸。幼年僵尸不可被成年僵尸骑乘,因此当指令『/ride @e[tybr /e=zombie] summon_ride zombie』在目标选择器『@e[tybr /e=zombie]』只选择到一个僵尸的情况下生成出一只幼年僵尸时,指令将执行失败,返回的成功次数为0。
也就是说,上述指令有5%的概率执行失败。我们可以造一个命令模块验证一下这5%的概率:
(指令版本:基岩版1.19,未开启实验性功能)
A→B→C→D→E→F→G→
A[重][无][红]······ride @e[tybr /e=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_sbr /awned
B[链][限][始]······scoreboard br /layers add count test 1
C[链][无][始]······ride @e[tybr /e=zombie,name=a] stobr /_riding
D[链][无][始]······execute @e[tybr /e=zombie,name=a]~~~ kill @e[tybr /e=zombie,r=6,name=!a]
E[链][无][始]·······execute @e[tybr /e=zombie,name=a]~~~ kill @e[tybr /e=item]
F[链][无][始]·······scoreboard br /layers add times test 1
G[链][无][始]······tbr / @e[tybr /e=zombie,name=a]-16 -60 0
\\图例\\
[重]重复;[无]无条件;[红]需要红石;[脉]脉冲;[限]有条件的;[始]始终活动;[链]连锁
\\使用到的计分项\\
test
\\使用到的变量\\
count(指令成功次数)、times(指令执行次数)
上面的模块会不断重复执行『ride @e[tybr /e=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_sbr /awned』这条指令,并计算出指令的成功次数和执行次数。经过运行,加上一点儿人工计算,就可以得到以下数据:
执行1784次,成功1699次,差值85,失败概率约4.76%
执行10000次,成功9488次,差值512,失败概率约5.12%
可见,概率差不多就是5%。
为什么我要提这东西呢?
/ride作为一个使得玩家能够控制实体骑乘的指令,竟然能够因为这个特性而用于概率计算中,挺令人惊讶的是不是?但其实,不管是对于指令还是隔壁红石来说,能够巧妙运用游戏本身的特性,就是进阶玩家的基本要求。/ride只是一个例子,像这样的例子还有很多。特别是在基岩版,由于指令自由度没有Java版高,这迫使得许多基岩版的指令玩家大显神通,通过许多看起来十分取巧的方法实现许多看似不可能实现的功能,这边举几个例子:
①通过玩家攻击隐形盔甲架来实现点击牌子、点击村民NPC的效果
②通过tell指令能够使用目标选择器的特性,在tell指令中塞入大量的@e目标选择器并发送给指定玩家,来使得指定玩家游戏卡死以实现封禁的效果
③在Java1.13版本前,由于没有能够读取NBT数据的指令,因此当时普遍的方法是通过选取具有特定NBT标签值的实体并给予指定标签或分数,并使用穷举的方法来实现读取NBT数据的功能
④通过testforblocks指令比较命令方块,来实现检测物品和玩家名是否一致
所以,有时候当你想实现一个功能时却不知道怎么实现,不妨放开脑洞,想一想一些指令的特性,或许你就有了思路!
本章到此完全为止。