第八十九章 ride-骑乘

(该章节已于2022年7月25日重写,原章节为『战利品表(战利品表下)(\/loot 下)』)

我们知道,在minecraft中,玩家可以骑上马,骷髅可以骑上蜘蛛,僵尸可以骑上鸡......但不管怎样,我们都很难使用指令来控制实体的骑乘状态。在java版这尚且可以通过nbt做到,但在基岩版呢?基岩版可用不了nbt。

好消息是,基岩版虽然用不了nbt,但mojang却给了我们一条指令:

\/ride

作用:控制实体骑乘

存在版本:基岩版1.16.100-今

需要权限等级:基岩版-1

需要作弊:是

格式:

\/ride <骑手实体>...

... start_riding <坐骑实体>[传送模式][骑乘建立要求]

\\\\使得指定的骑手骑在指定的坐骑上\\\\

... stop_riding

\\\\使得指定的骑手停止骑乘\\\\

... summon_ride <实体id>[召唤要求][生成事件][实体名称]

\\\\给骑手召唤一个坐骑,让骑手骑上去\\\\

\/ride <坐骑实体>...

... evict_riders

\\\\使得指定的坐骑逐出它们的骑手\\\\

... summon_rider <实体id>[生成事件][实体名称]

\\\\给坐骑召唤一个骑手,让召唤出来的骑手骑在坐骑上\\\\

通过\/ride指令,你可以指定实体骑或被骑在某些实体身上。让我们来试一试:

\/ride start_riding [type=horse]zuqi.org 葡萄小说网

这条指令将会使你随机骑在某一匹马的身上。等等,不是用来随机选择玩家的吗,怎么能够拿来随机选择马?

确实是用来随机选择玩家的,但在除了及以上版本之外,其他版本的都可以通过指定type参数来具体随机指定种类的实体。在上面的例子中,由于我们指定了type参数为马,所以[type=horse]在这边就是随机选择一匹马。

运行上述指令后,你虽然骑在了马身上,但同时也被传送了,毕竟游戏总不可能让你隔空骑马吧?但有时候可能你并不想被传走,而是想让那匹马自己过来,这时候该怎么办?

指定『传送模式』参数。这个参数可以填写两个值:

teleport_ride——将坐骑传送至骑手

teleport_rider——将骑手传送至坐骑(默认)

举个例子:

\/ride start_riding [type=horse] teleport_ride

这条指令将会随机一匹马传送到你下面,然后让你骑在它的身上。

『骑乘建立要求』这个参数适用于当你指定多个骑手时的情况,它可以填写两个值:

if_group_fits——当所有骑手都满足骑乘要求时才会建立骑乘关系

until_full——给每一个满足骑乘要求的骑手建立骑乘关系(默认)

举个例子:

\/ride start_riding [type=chicken] teleport_rider if_group_fits

\/ride start_riding [type=chicken] teleport_rider until_full

假设现在有三个实体:你自己、一只成年僵尸、一只鸡。运行第一条指令,将不会发生什么,因为你不可能骑在鸡上面,鸡也不能骑在自己上面,选中的三个骑手中有两个不满足要求,自然僵尸也不会骑上去。运行第二条指令,僵尸就会骑到鸡的上面,因为虽然你和鸡都不满足要求,但僵尸满足了要求,自然就和鸡建立起了骑乘关系。(你干嘛~哎哟)

这个僵尸还有用,让我们把它从鸡上弄下来:

\/ride [type=zombie] stop_riding

summon_ride子命令可以直接生成一个实体作为坐骑,当然,如果骑手不符合被生成实体的骑乘要求,那么实体即使被召唤出来也不会被骑乘,仅仅只会单纯生成出来。还是以刚才的条件,举个例子:

\/ride [type=zombie] summon_ride minecraft:boat

这将会给那位僵尸生成一艘船,然后让它坐进去。

『召唤要求』参数可以填写三个值:

skip_riders ——仅仅为没有坐骑的骑手召唤坐骑

no_ride_change ——仅仅为没有坐骑且也没有被骑乘的骑手召唤坐骑

reassign_rides——为所有骑手召唤坐骑(默认)

举些例子:

\/ride summon_ride minecraft:boat skip_riders

\/ride summon_ride minecraft:boat no_ride_change

\/ride summon_ride minecraft:boat reassign_rides

还是以上面的情况为条件。如果我们运行了第一条指令,游戏将会尝试给玩家(你自己)、鸡和船召唤坐骑,僵尸由于已经有一个船作为坐骑所以不会尝试召唤。

如果我们运行第二条指令,游戏将会仅给玩家和鸡召唤船作为坐骑。僵尸由于已经有坐骑、船由于被僵尸骑乘,所以两者都不会尝试召唤坐骑。

如果我们运行第三条指令,游戏将会给所有实体都尝试召唤坐骑。

当然,不管你运行的是上面哪条指令,最终结果都是你和鸡会坐上船,僵尸和僵尸的船不会发生变化。因为僵尸已经有一个船作为坐骑,再召唤的话,僵尸的新坐骑必定会插入到僵尸和船之间,骑着船也被僵尸骑,也就是得满足两个实体的骑乘要求。而船肯定不会被船骑乘,也不会骑着一个船,所以僵尸和船都不会发生变化。

evict_riders子命令可以使坐骑赶走自己的骑手:

\/ride evict_riders

这将会使得所有实体赶走自己的骑手,也就是让你、鸡和僵尸都从船上下来。然后你就可以把船回收一下。

summon_rider子命令可以为一个坐骑生成骑手,举个例子:

\/ride [type=zombie] summon_rider minecraft:zombie

仍然以上面的情况为条件,这条指令将会给那只僵尸生成一只新的僵尸,然后让新的僵尸骑在老的僵尸上面。

值得注意的是,由于成年僵尸也可以像幼年僵尸一样骑在成年僵尸上,这就给了我们一条途径在基岩版弄叠罗汉:

\/ride [type =zombie] summon_rider zombie minecraft:as_adult

这将会给让所有僵尸尝试生成一个新的成年僵尸作为自己的骑手,然后.......你重复运行下试试?

这就是\/ride指令的基本用法,也就是本章的全部内容。

附表:\/ride历史

基岩版

1.16.100——加入了\/ride

......

......

......

......

......

......

......

......

......

自然生成的僵尸,有5%的概率生成出一只幼年僵尸。幼年僵尸不可被成年僵尸骑乘,因此当指令『\/ride [type=zombie] summon_ride zombie』在目标选择器『[type=zombie]』只选择到一个僵尸的情况下生成出一只幼年僵尸时,指令将执行失败,返回的成功次数为0。

也就是说,上述指令有5%的概率执行失败。我们可以造一个命令模块验证一下这5%的概率:

(指令版本:基岩版1.19,未开启实验性功能)

a→b→c→d→e→f→g→

a[重][无][红]······ride [type=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_spawned

b[链][限][始]······scoreboard yers add count test 1

c[链][无][始]······ride [type=zombie,name=a] stop_riding

d[链][无][始]······execute [type=zombie,name=a]~~~ kill [type=zombie,r=6,name=!a]

e[链][无][始]·······execute [type=zombie,name=a]~~~ kill [type=item]

f[链][无][始]·······scoreboard yers add times test 1

g[链][无][始]······tp [type=zombie,name=a]-16 -60 0

\\\\图例\\\\

[重]重复;[无]无条件;[红]需要红石;[脉]脉冲;[限]有条件的;[始]始终活动;[链]连锁

\\\\使用到的计分项\\\\

test

\\\\使用到的变量\\\\

count(指令成功次数)、times(指令执行次数)

上面的模块会不断重复执行『ride [type=zombie,name=a] summon_ride zombie reassign_rides minecraft:entity_spawned』这条指令,并计算出指令的成功次数和执行次数。经过运行,加上一点儿人工计算,就可以得到以下数据:

执行1784次,成功1699次,差值85,失败概率约4.76%

执行次,成功9488次,差值512,失败概率约5.12%

可见,概率差不多就是5%。

为什么我要提这东西呢?

\/ride作为一个使得玩家能够控制实体骑乘的指令,竟然能够因为这个特性而用于概率计算中,挺令人惊讶的是不是?但其实,不管是对于指令还是隔壁红石来说,能够巧妙运用游戏本身的特性,就是进阶玩家的基本要求。\/ride只是一个例子,像这样的例子还有很多。特别是在基岩版,由于指令自由度没有java版高,这迫使得许多基岩版的指令玩家大显神通,通过许多看起来十分取巧的方法实现许多看似不可能实现的功能,这边举几个例子:

1通过玩家攻击隐形盔甲架来实现点击牌子、点击村民npc的效果

2通过tell指令能够使用目标选择器的特性,在tell指令中塞入大量的目标选择器并发送给指定玩家,来使得指定玩家游戏卡死以实现封禁的效果

3在版本前,由于没有能够读取nbt数据的指令,因此当时普遍的方法是通过选取具有特定nbt标签值的实体并给予指定标签或分数,并使用穷举的方法来实现读取nbt数据的功能

4通过testforblocks指令比较命令方块,来实现检测物品和玩家名是否一致

所以,有时候当你想实现一个功能时却不知道怎么实现,不妨放开脑洞,想一想一些指令的特性,或许你就有了思路!

本章到此完全为止。

上一章目录+书架下一章